长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。
#define N 10000
int swap_num(int* A, int i, int j)
{
if(i == j) return -1;
A[i] ^= A[j];
A[j] ^= A[i];
A[i] ^= A[j];
return A[i] == 0 ? i : j;
}
void random_num(int* A, int n)
{
srand((unsigned) time(NULL));
for(int i = 0; i < n; ++i)
A[i] = i;
int size = n;
while(size--)
swap_num(A, rand()%n, rand()%n);
}
void sort_num(int* A, int n)
{
int f_zero = 0;
for(int i = 0; i < n; ++i)
{
if(A[i] == 0)
{
f_zero = i;
break;
}
}
f_zero = swap_num(A, 0, f_zero);
int f = 1; //偏移指针
int count = 0;
while(f < n)
{
while(A[f] != f)
{
f_zero = swap_num(A, A[f], f_zero);
f_zero = swap_num(A, f, f_zero);
f_zero = swap_num(A, 0, f_zero);
count++;
}
++f;
}
printf("%d\n", count);
}