位圖法排序


分析:那么我們來看一個具體的例子,假設我們要對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),這樣就達到了排序的目的。

代碼實現如下:

View Code
 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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM