zoukankan      html  css  js  c++  java
  • 简单一道排序题,考倒多少读书人

    从华为一道面试题来看看吧,原题大意是这样的:
     

      有N个大小不等的自然数(1--N),请将它们由小到大排序。
        要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
          (请你做做看,时间20分钟)

     有人这样做:

    void sort(int e[], int n)
    {
     
    int i;
     
    int t; /*临时变量:空间复杂度O(1)*/

     
    for (i=1; i<n+1; i++/*时间复杂度O(n)*/
     {
      t 
    = e[e[i]]; /*下标为e[i]的元素,排序后其值就是e[i]*/
      e[e[i]] 
    = e[i];
      e[i] 
    = t;
     }
    }

    void main()

     
    #define MAX 10
     
    int i, a[MAX+1]; 
     
     printf(
    "Input the number from 1 to %d:/n",MAX);
     
    for (i=1; i<MAX+1; i++)
     {
      scanf(
    "%d",&a[i]);
     }
      
     sort(a,MAX);

     printf(
    "/n====sort over====/n");
     
    for (i=1; i<MAX+1; i++)
     {
      printf(
    "%d ",a[i]);
     }

     printf(
    "/n");
     system(
    "pause");
    }

    上述答案其实是不对的,请看下面:

    void sort(int e[], int n)
    {
    int i;
    int t; /*临时变量:空间复杂度O(1)*/

    for (i=1; i<n+1; i++/*时间复杂度O(n)*/
    {
    while(e!=i)
    {
       t 
    = e[e]; /*下标为e的元素,排序后其值就是e*/
       e[e] 
    = e;
       e 
    = t;
    }
    }

     这个while 实在是太强大了,心血沸腾,于是赶紧记录之。

  • 相关阅读:
    mysql逻辑备份
    Configuring ProxySQL
    CSS伸缩布局
    溢出文字隐藏三种方式
    CSS过渡效果transition和动画
    伪元素before和after本质
    css滑动门技术
    字体图标iconfont
    CSS精灵技术(sprite)
    行内块和文字垂直对齐vertical-agign
  • 原文地址:https://www.cnblogs.com/liulei/p/2182681.html
Copyright © 2011-2022 走看看