通过位图对纯数字数据排序

条件:数字密度较大,每个数只出现一次,数字在一定范围内,纯数字数据

#include<iostream>
using namespace std;
#define BITSPERINT sizeof(int)//数组num中每个元素有多少位
#define MASK 0x1F  //对于每个待输入的数字,与MASK与,得到在num[index]中第几位order
#define SHIFT 5  //对于每个待输入的数字,右移5(除32)找到对应下标index
#define N 10000000
int num[1 + N/BITSPERINT]//也可以用char
//以下函数假定没有异常输入
void Clear(int i)//将第i位置0
{
	//i&MASK即i%(MASK+1)  i>>SHIFT即i/SHIFT  改用位运算速度快
    num[i>>SHIFT]  &= ~(1<<(i&MASK));  
}
void Set(int i)//将第i位置1
{
    num[i>>SHIFT]  |= (1<<(i&MASK));
}
int Read(int i)//判断i是否出现过非0则存在,0则不存在
{
    return  num[i>>SHIFT]  & (1<<(i&MASK));
}

/*0-NClear(),然后依次将待排序数Set,最后0-N依次Read(),若返回非0,则输出该数字,完成排序。*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值