编程珠玑:位图排序海量整数

具体案例见编程珠玑第二版第一章开篇,下面是测试的代码:

#include 
#include 
using namespace std;
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define MAXNUM 10000       //最大整数
const int num=6000;      //整数个数
int length=1 + MAXNUM/BITSPERWORD;
unsigned int *a=new unsigned int[length];

//i>>SHIFT表示i在数组中的下标;1<<(i & MASK))等价于i%32,表示第几个bit
void set(int i) {    a[i>>SHIFT] |=  (1<<(i & MASK)); }  //将某bit置1
void clr(int i)  {    a[i>>SHIFT] &= ~(1<<(i & MASK)); }  //将某bit置0
//若第0bit为1,返回1;若第3bit为1,则返回8;若第10bit为1,则返回1024
int  test(int i) { return a[i>>SHIFT] &   (1<<(i & MASK)); }    

int main(void)
{	
	for (int i=0;i!=length;++i)     
		a[i]=0;				//每bit都初始化为0
	srand(time(0));
	int i=0;
	while(i!=num)        //生成num个大小不超过MAXNUM的整数
	{
		int p=rand()%MAXNUM;
		if (!test(p))
		{
			set(p);
			++i;
		}
	}

	for (i=0;i


上面的代码只适用整数不重复的情况下。这一章后面的第6题提出一个问题:若每个整数至多只能出现10次该怎么做呢?那就用4位来表示一个整数出现的次数。


你可能感兴趣的:(杂记)