随笔 - 39  文章 - 0  评论 - 44  1

 

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

 

  有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 实在是太强大了,心血沸腾,于是赶紧记录之。

posted on 2011-09-20 17:12  漫长路  阅读(...)  评论(...编辑  收藏
宝宝客 www.baobaoke.com