看到一个高效的排序算法,叫做位排序。首先了解一下,将一组数据变成位存储结构,如下面一段0,1串:
01010000101011101
表示集合{1,3,8,10,12,13,14,16},当然数据是从零开始的,此算法只是对不重复的正整数进行排序的。
有必要介绍如下两种操作:
i>>SHIFT,i/32得出字节数(因为是int型);
i & MASK , i mod MASK。
代码如下:
#include <stdio.h>
#define SHIFT 5
#define MASK 0x1f
#define n 100000000
#define bits 32
int a[1+n/bits];
//将第i位数据设为1;
void set(int i) {a[i>>SHIFT] |= (1<<(i & MASK));}
//将各位的数据置为0;
void clr(int i) {a[i>>SHIFT] &= ~(1<<(i & MASK));}
//取第i位;
int test(int i) {return (a[i>>SHIFT] & (1<<(i & MASK)));}
int main()
{
int i;
for(i=0;i<n;i++)
clr(i);
//输入数据,输到0结束;
while(scanf("%d",&i)!=EOF && i!=0)
set(i);
for(i=0;i<n;i++)
{
if(test(i)) //若第i位是1,则输出;
printf("%d\n",i);
}
printf("Hello, world\n");
return 0;
}