日期:2014-05-20  浏览次数:20734 次

菜鸟请教一道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;
}
 }