大概是空间换时间的思想,用一个bit标示一个数字;
关于产生前N个数的随机排列的方法需要注意~
#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;
}