位排序

来源:互联网 发布:linux获得root权限 编辑:程序博客网 时间:2024/05/22 10:22

        位排序,顾名思义,就是利用另外的内存空间来存放要排序的数据,其中的为就是每个数的大小所对应的位置。我们知道一个字节是8位,如果用来表示数的话,可以表示8个数,但数的大小只能在0-7之间。这一点和基数排序有些共同点。数值越大越占用空间,且源数据不能有重复。

源程序如下:

#include <stdio.h>#include <malloc/malloc.h>#define BYTESIZE 8#define MASK 0x7#define SHIFT 3//将pos的对应位置1,注意是将第pos位置1void 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;}
参考了网上的一位大神程序,向他致敬

0 0
原创粉丝点击