三十分鐘理解:雙調排序Bitonic Sort,適合並行計算的排序算法

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld
技術交流QQ羣:433250724,歡迎對算法、技術、應用感興趣的同窗加入算法


雙調排序是data-independent的排序, 即比較順序與數據無關的排序方法, 特別適合作並行計算,例如用GPU、fpga來計算。數組

一、雙調序列

在瞭解雙調排序算法以前,咱們先來看看什麼是雙調序列。 雙調序列是一個先單調遞增後單調遞減(或者先單調遞減後單調遞增)的序列。markdown

二、Batcher定理

將任意一個長爲2n的雙調序列A分爲等長的兩半X和Y,將X中的元素與Y中的元素一一按原序比較,即a[i]與a[i+n] (i < n)比較,將較大者放入MAX序列,較小者放入MIN序列。則獲得的MAX和MIN序列仍然是雙調序列,而且MAX序列中的任意一個元素不小於MIN序列中的任意一個元素[2]。網絡

三、雙調排序

假設咱們有一個雙調序列,則咱們根據Batcher定理,將該序列劃分紅2個雙調序列,而後繼續對每一個雙調序列遞歸劃分,獲得更短的雙調序列,直到獲得的子序列長度爲1爲止。這時的輸出序列按單調遞增順序排列。ide

見下圖:升序排序,具體方法是,把一個序列(1…n)對半分,假設n=2^k,而後1和n/2+1比較,小的放上,接下來2和n/2+2比較,小的放上,以此類推;而後當作兩個(n/2)長度的序列,由於他們都是雙調序列,因此能夠重複上面的過程;總共重複k輪,即最後一輪已是長度是2的序列比較了,就可獲得最終的排序結果。.net

雙調排序示意圖[1]:blog

這裏寫圖片描述

四、任意序列生成雙調序列

前面講了一個雙調序列如何排序,那麼任意序列如何變成一個雙調序列呢?排序

這個過程叫Bitonic merge, 實際上也是divide and conquer的思路。 和前面sort的思路正相反, 是一個bottom up的過程——將兩個相鄰的,單調性相反的單調序列看做一個雙調序列, 每次將這兩個相鄰的,單調性相反的單調序列merge生成一個新的雙調序列, 而後排序(同三、雙調排序)。 這樣只要每次兩個相鄰長度爲n的序列的單調性相反, 就能夠經過鏈接獲得一個長度爲2n的雙調序列,而後對這個2n的序列進行一次雙調排序變成有序,而後在把兩個相鄰的2n序列合併(在排序的時候第一個升序,第二個降序)。 n開始爲1, 每次翻倍,直到等於數組長度, 最後就只須要再一遍單方向(單調性)排序了。遞歸

以16個元素的array爲例,
1. 相鄰兩個元素合併造成8個單調性相反的單調序列,
2. 兩兩序列合併,造成4個雙調序列,分別按相反單調性排序
3. 4個長度爲4的相反單調性單調序列,相鄰兩個合併,生成兩個長度爲8的雙調序列,分別排序
4. 2個長度爲8的相反單調性單調序列,相鄰兩個合併,生成1個長度爲16的雙調序列,排序圖片

示意圖[1]:

這裏寫圖片描述

詳細Bitonic merge圖(本圖只畫到生成一個16長的雙調序列,最後排序沒有畫出):

這裏寫圖片描述

最後再放一個8個元素排序的示意圖[5]:

這裏寫圖片描述

五、非2的冪次長度序列排序

這樣的雙調排序算法只能應付長度爲2的冪的數組。那如何轉化爲能針對任意長度的數組呢?一個直觀的方法就是使用padding。即便用一個定義的最大或者最小者來填充數組,讓數組的大小填充到2的冪長度,再進行排序。最後過濾掉那些最大(最小)值便可。這種方式會使用到額外的空間,並且有時候padding的空間比較大(如數組長度爲1025個元素,則須要填充到2048個,浪費了大量空間)。可是這種方法比較容易轉化爲針對GPU的並行算法。因此通常來講,並行計算中常使用雙調排序來對一些較小的數組進行排序[3]。 若是要考慮不用padding,用更復雜的處理方法,參考[4] n!=2^k的雙調排序網絡,本文略。

參考資料

[1] CUDA(六). 從並行排序方法理解並行化思惟——冒泡、歸併、雙調排序的GPU實現, http://blog.csdn.net/abcjennifer/article/details/47110991
[2] 並行計算】Bitonic Sort(雙調排序)基礎, http://blog.csdn.net/jiange_zh/article/details/49533477
[3] 雙調排序:從串行到並行,以及OpenCL上的實現, http://blog.csdn.net/bryanlai0720/article/details/45094675
[4] n!=2^k的雙調排序網絡, http://blog.csdn.net/ljiabin/article/details/8630627
[5] 分段雙調排序實現, http://blog.csdn.net/u014226072/article/details/56840243

相關文章
相關標籤/搜索