位图排序实际上就是一种向量存储,编程珠玑里面使用它来给正整数排序。那么向量也有正有负,为什么不能用它来给负数排序。基于这个想法,尝试使用位图排序给整个整数排序,C语言实现代码如下:
#include <stdio.h>
#define SHIFT 5
#define MASK 0x1F
#define N 10000000 //定义能够储存多少数
int a[1+N/32];
int ZP=(1+N/32)/2*32+1; //确定零点,我选择的是中间位置 ,在此位置右边的位置存储负整数即负向量,左边存储正整数即正向量
//set()函数用于储存向量
//在这里需要判断输入的数的正负,向量的方向
void set(int i) {
int j;
if(i<0)
{
i=-i;
j=ZP-i;
a[j>>SHIFT]|=(1<<(j&MASK)); // 这里的j&MASK,就是j%32
}
else{
j=ZP+i;
a[j>>SHIFT]|=(1<<(j&MASK));
}
}
//clr()函数用来初始化数组
void clr(int i){
a[i>>SHIFT]&=~(1<<(i&MASK));
}
//test()函数用来判断此位上的二进制数是0还是1
int test(int i){
return a[i>>SHIFT]&(1<<(i&MASK));
}
int main(){
int i;
for(i=0;i<N;i++){
clr(i);
}
while(scanf("%d",&i)!=EOF){
set(i);
}
for(i=0;i<N;i++){
//如果此位上的二进制数是1,表示这个位置有向量存储 ,输出具体的数
if(test(i))
printf("%d\n",i-ZP);
}
}