题目如下:
有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n), 空间复杂度为O(1) ,使用交换,而且一次只能交换两个数。
#include <iostream.h>
#include <assert.h>
#include <string.h>
void main(void)
{
int a[] = {2, 4, 1, 3};
int len = sizeof(a)/sizeof(a[0]);
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] < < " " ;
}
cout < < endl;
}
此题应用在特殊情况,1~n(整数)间的排序,数组序数与它的值间有一定关系a[i]=i+1; 设a[i]中的数为x,那么排序后x就应该排在a[x-1]。所以如上操作既可以实现快速排序。
以此类推,只要数组序数与它的值间有一定关系的话,即可以使用此法。