菜鸟请教一道1到N自然数排序的华为面试题
有N个大小不等的自然数(1--N),请将它们由小到大排序。
要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
网上给出的算法是这样:
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;
}
}
可我用它对数组5,4,3,1,2排序,怎么不行呢?
是那个算法的问题么?
如果那个算法不对,那正确的应该是什么样的?
这里高人众多,希望有人帮助
对,忘了,关于数组下标开始是0的问题,我已经考虑到了。可按那个算法排完了应该是2,1,3,4,5啊
------解决方案--------------------void sort(int a[], int n)
{
int i;
int t; /*临时变量:空间复杂度O(1)*/
for (i=1; i<n+1; i++) /*时间复杂度O(n)*/
{
while(a[i]!=i)
{
t = a[a[i]];
a[a[i]] = a[i];//排好一个元素
a[i] = t;
}
}
}