分析:那么我們來看一個具體的例子,假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這里假設這些元素沒有重復)。那么我們就可以采用Bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個Bit(1Bytes),首先我們開辟1Byte的空間,將這些空間的所有Bit位都置為0,如下圖:
然后遍歷這5個元素,首先第一個元素是4,那么就把4對應的位置為1(可以這樣操作:p+(i/8)|(0x01<<(i%8))當然了這里的操作涉及到Big-ending和Little-ending的情況,這里默認為Big-ending),因為是從零開始的,所以要把第五位置為一(如下圖):
接着再處理第二個元素7,將第八位置為1,,接着再處理第三個元素,一直到最后處理完所有的元素,將相應的位置為1,這時候的內存的Bit位的狀態如下:
最后我們現在遍歷一遍Bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。
代碼實現如下:

1 /*****位圖排序法**********/ 2 3 #include <memory.h> 4 #include <iostream.h> 5 6 #define BYTESIZE 8 7 8 void SetBit(unsigned char *data,int pos) 9 { 10 for (int i=0;i<pos/BYTESIZE;i++) 11 { 12 data++; 13 } 14 15 *data=(*data)|(0x01<<(pos%BYTESIZE)); 16 } 17 18 void BitmapSort(int data[],int n) 19 { 20 if (NULL==data || n<=0) 21 { 22 return; 23 } 24 25 int max=data[0]; 26 for (int i=1;i<n;i++) 27 { 28 if (data[i]>max) 29 { 30 max=data[i]; 31 } 32 } 33 34 int iByteNum=max/BYTESIZE+1; 35 36 unsigned char *p=new unsigned char[iByteNum]; 37 unsigned char *q=p; 38 memset(p,0,iByteNum); 39 int *temp=new int[n]; 40 int num=0; 41 42 for(i=0;i<n;i++) 43 { 44 SetBit(p,data[i]); 45 } 46 for (i=0;i<iByteNum;i++) 47 { 48 for (int j=0;j<BYTESIZE;j++) 49 { 50 if (((*p)&(0x1<<j))==(0x1<<j)) 51 { 52 temp[num]=i*BYTESIZE+j; 53 num++; 54 } 55 } 56 p++; 57 } 58 memcpy(data,temp,sizeof(int)*n); 59 delete []q; 60 delete []temp; 61 62 } 63 64 void main() 65 { 66 int data[]={8,7,1,2,4,5,12,11,10}; 67 BitmapSort(data,9); 68 for (int i=0;i<9;i++) 69 { 70 cout<<data[i]<<" "; 71 } 72 }