简单一道排序题,考倒多少读书人

 

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

 

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

作者: 漫长路 发表于 2011-09-20 17:12 原文链接

评论: 2 查看评论 发表评论


最新新闻:
· 纸质名片杀手Cardcloud推出Android应用(2011-09-20 17:43)
· 消亡的是桌面操作系统,而非台式机(2011-09-20 17:40)
· Ruby on Rails 3.1发布了,带来了资产管道、流和JavaScript的改变(2011-09-20 17:32)
· 魅族MX首张官方图曝光 M9降价为其开道(2011-09-20 17:18)
· Team Foundation Server 11中的应用生命周期管理(2011-09-20 17:15)

编辑推荐:忘记敏捷

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

你可能感兴趣的:(排序,读书人)