1. 程式人生 > >舊文-Bitsort排序算法-2007-10-10 16:08

舊文-Bitsort排序算法-2007-10-10 16:08

lis ask alt 清0 ini return 排序 分享 file

《Programming pearls》中有對該算法的介紹。 該算法的復雜度為O(X),X為欲排序的最大的數。不適合於有重復數據的排序,重復的數據會被當作一個數據輸出。

還是看代碼吧!

c程序實現:
選自《Programming pearls》

技術分享
/*   bitsort.c   --   bitmap   sort   from   Column   1  
    *       Sort   distinct   integers   in   the   range   [0..N-1]  
    */  
   
  #include   <stdio.h>  
   
  #define
BITSPERWORD 32 // 定義每個int類型可以容納32位 #define SHIFT 5 // 32=2^5 #define MASK 0x1F // 5位的屏蔽 #define N 10000000 // 位數組總共有多少位 int a[1 + N/BITSPERWORD]; // 位數組用int數組來實現 void
set(int i){ a[i>>SHIFT] |= (1<<(i & MASK)); } //置1第i位 /* 提取數組當中的第i位 因為每個int容納32位, i/32的整數部分就是在int數組當中哪個元素裏面,位移替代除法 i/32的余數部分就是int數組當中相應元素對應的位數 比如 i=61, 那麽 i/32 = 1 表示在a[1]元素當中 i=61, i/32的余數是29=i&mask, 表示在a[1]元素的第29位保存
*/ void clr(int i){ a[i>>SHIFT] &= ~(1<<(i & MASK)); } //清0第i位 int test(int i){ return a[i>>SHIFT] & (1<<(i & MASK)); } //提取第i位的值 int main() { int i; for (i = 0; i < N; i++) clr(i); // 把數組每一位都設置為0 // 因為逐位操作效率不高,可以用下面的三行對整型數組賦值的方式取代 /* Replace above 2 lines with below 3 for word-parallel init int top = 1 + N/BITSPERWORD; for (i = 0; i < top; i++) a[i] = 0; */ while (scanf("%d", &i) != EOF) // 根據輸入的數值,設置對應的位 set(i); for (i = 0; i < N; i++) // 檢測哪一位是1 if (test(i)) printf("%d ", i); return 0; }


python語言實現:
摘自:http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/528942

技術分享
 1 # Python implementation of bitsort algorithm from "Programming Pearls"
 2 #http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/528942
 3 
 4 def bitsort(filename, maxn):
 5     """ Sort a file named ‘filename‘ which
 6     consists of maxn integers where each
 7     integer is less than maxn """
 8 
 9     # Initialize bitmap
10     a = [0]*maxn
11 
12     # Read from file and fill bitmap
13     for line in file(filename):
14         n = int(line.strip())
15         # Turn bits on for numbers
16         if n<maxn: a[n] = 1
17 
18     # Return a generator that iterates over the list
19     for n in range(len(a)):
20         if a[n]==1: yield n
21 
22     
23 if __name__=="__main__":
24     # numbers.txt should contain a list of numbers
25     # each less than 1000000, one per line.
26     for num in bitsort(numbers.txt,1000000):
27         print num


技術分享

舊文-Bitsort排序算法-2007-10-10 16:08