位排序

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值