位排序

来源:互联网 发布:安卓变声软件 编辑:程序博客网 时间:2024/06/08 01:17

看到一个高效的排序算法,叫做位排序。首先了解一下,将一组数据变成位存储结构,如下面一段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 32int 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;}

0 0
原创粉丝点击