1、位向量表示0~N的整數 在普通機器上,一個int型整數有4個字節,共32位,我們可以通過這32位中不同的位來表示不同的整數; 創建一個數組array[100],利用類的概念,array[0]存放32個除32等於0的整數,它的模數在32位中的相應位表示,相應的array[1]存放除32等於1的整數; 如: [cpp] int i = 5; // 5/32 = 0; 5%32 = 5 int j = 12; // 12/32 = 0; 12%32 = 12 int k = 31; // 31/32 = 0; 31%32 = 31 int m = 34; // 34/32 = 1; 34%32 = 2 int n = 40; // 40/32 = 1; 40%32 = 8 此時,這5個數在array中的存儲就應該是下面這種情況: array[0] = 0000 0100 0000 1000 0000 0000 0000 0001b array[1] = 0010 0000 1000 0000 0000 0000 0000 0000b array[2] = ... = array[99] = 0 模數在相應的位將0置為1,這樣就可以表示相應的整數了; 2、位向量排序 [cpp] int main(void) { int i; for(i = 0;i < N;i++) clr(i);//復位整個數組 while(scanf("%d",&i) != EOF) set(i);//把將要排序的數在數組中用位向量標記 for(i = 0;i < N;i++) if(test(i))//用於比較i是否在數組中標記,若有標記就可以按順序輸出 printf("%d\n",i); return 0; } N為需要排序的整數的可能最大值,clr函數將整個數組復位,然後set函數就是利用位向量的表示法將想排序的整數在數組中做一個標記; 當我們遍歷0~N的整數的時候,需要排序的整數肯定在這N個數裡面,只要利用test函數檢測i是否在數組中標記,就可以知道此數是否為我們要排序的數,如果有標記,直接輸出即可,這樣就可以達到排序的目的了; 3、算法分析 時間復雜度:O(N); 空間復雜度:O(N/32 + 1); 4、源碼——代碼分享