位排序,顾名思义,就是利用另外的内存空间来存放要排序的数据,其中的为就是每个数的大小所对应的位置。我们知道一个字节是8位,如果用来表示数的话,可以表示8个数,但数的大小只能在0-7之间。这一点和基数排序有些共同点。数值越大越占用空间,且源数据不能有重复。
源程序如下:
#include <stdio.h>
#include <malloc/malloc.h>
#define BYTESIZE 8
#define MASK 0x7
#define SHIFT 3
//将pos的对应位置1,注意是将第pos位置1
void SetBit(char *p, int pos)
{
//pos>>SHIFT == pos/8
//pos&MASK == pos%8
//再将该位置1
p[pos>>SHIFT] |= (0x01<<(pos&MASK));
}
void BitMapSort()
{
int num[] = {3,9,2,10,6,11,8,14,7};
//BufferLen这个值是根据待排序的数据中最大值确定的
//待排序中的最大值是14,因此只需要2个字节
const int BufferLen = 2;
char *pBuffer = (char*)malloc(sizeof(char)*BufferLen);
//要将所有的Bit位置为0,否则结果不可预知。
memset(pBuffer,0,BufferLen);
for(int i = 0; i < 9;i++)
{
//首先将相应Bit位上置为1
SetBit(pBuffer,num[i]);
}
//输出排序结果
for(int i = 0;i<BufferLen;i++)//每次处理一个字节(Byte)
{
for(int j = 0;j<BYTESIZE;j++)//处理该字节中的每个Bit位
{
//判断该位上是否是1,进行输出
//首先得到该第j位的掩码(0x01<<j),将内存区中的
//位和此掩码作与操作。最后判断掩码是否和处理后的
//结果相同
if((*pBuffer&(0x01 << j)) == (0x01 <<j))
{
printf("%d ",i*BYTESIZE + j);
}
}
pBuffer++;
}
}
int main()
{
BitMapSort();
return 0;
}
参考了网上的一位大神程序,向他致敬