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

#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,则输出该数字,完成排序。*/
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐