引题:有1,2,….一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1)。
快速排序被认为是速度最快算法 ,时间复杂度是:nlog(n),下面这个是O(n),当然是有一定的条件的,不具普遍性,但是它的思路还是挺有技巧的。
1~N的数组,那么排序后必然a[0]=1,a[1]=2,a[2]=3........也就是元素值必定是存放在比值小1的数组元素中,那么只需 a[n]和a[a[n]-1]相交换即可。有1,2,....一直到n 的无序数组, 求排序算法, 并且要求时间复杂度为O(n),空间复杂度O(1),使用交换, 而且一次只能交换两个数.(华为)
#include
int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;
for(int i = 0; i < len; )
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;
if ( a[i] == i + 1)
i++;
}
for (int j = 0; j < len; j++)
cout<<a[j]<<",";
return 0;
}