大概是空间换时间的思想,用一个bit标示一个数字; 关于产生前N个数的随机排列的方法需要注意~ #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 unsigned int Rand(int low, int high) { if ( low == high ) return low; return low + rand()%(high-low); } void Swap( int * a, int * b) { int tmp = *a; *a = *b; *b = tmp; } void Input(int a[] ) { srand(time(0)); int i; for ( i = 0; i < N; ++i ) a[i] = i; for ( i = 0; i < N; ++i ) Swap(&a[i], &a[Rand(i, N-1)]); } static unsigned char bits[N/8] ; void Sort(int a[]) { int i; for ( i = 0; i < N; ++i ) { int index = a[i]/8; int offset = a[i]%8; bits[index] |= (0x01<<offset); } } void Output( int a[] ) { int i; for ( i = 0; i < N/8; ++i ) { unsigned char mask = 0x01; int cnt = -1; while ( ++cnt < 8) { if ( bits[i] & mask ) printf("%d/n" , i*8 + cnt ); mask <<= 1; } } } int main() { unsigned int array[N]; Input(array) ; Sort(array); Output(array); return 0; }