从华为一道面试题来看看吧,原题大意是这样的:
有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");
}
{
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;
}
}
{
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 实在是太强大了,心血沸腾,于是赶紧记录之。