您的位置:首页 > 其它

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

2011-09-20 17:12 267 查看
从华为一道面试题来看看吧,原题大意是这样的:

  有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 实在是太强大了,心血沸腾,于是赶紧记录之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: