一、簡介
雙調排序(bitonic sort)屬於排序網路(sorting network)的一種,它是一種可以平行計算的排序演算法。
要理解雙調排序,首先需要理解雙調序列,雙調序列定義如下:
如果序列滿足以下兩個條件之一,則稱之為雙調序列:™
存在乙個0≤k≤n-1,使得為公升序序列,為降序序列;或存在乙個標號的迴圈移位,使得條件1)滿足。
如果n為偶數,且為公升序序列,為降序序列,則以下兩個序列都是雙調序列
s1=s2=
雙調排序主要思想:
1、首先不斷的二分,直到每組只剩下乙個元素,然後開始歸併。
2、雙調排序歸併時以不大於n的最大2的冪次方2^k為界限,把2^k~n的元素分別與0~(n-2^k)的元素比較,然後再分別在0~2^k和2^k~n這兩段上應用比較網路。
3、雙調排序難以理解的地方就在於這個歸併的過程,假設我們要把長度為n的序列a公升序排列,由於二分時是把前n/2的序列降序排列後n/2的序列公升序排列的,而n-2^k < n/2,所以前n-2^k 和後n-2^k個元素都大於中間的元素,當前n-2^k個元素和後n-2^k個元素比較時,會把序列中最大的n-2^k個元素放到最後n-2^k個位置上,也就是說比較後,2^k~n的元素都比0~2^k的元素大,這樣在分別對這兩段用同樣的方法歸併,最終得到完整的公升序序列。
以6個元素的序列為例,當前3個元素已經降序排好,後3個元素已經公升序排好(遞迴到底時是從1個元素開始返回的,所以對6個元素歸併時前後3個元素已經排好序),這個以4(不大於6的最大2的冪次方)為界限,分別讓第1個和第5個、第2個和第6個元素比較,使得這6個元素中最大的兩個處於第5、6個位置上,然後再分別對前4個和後2個元素按此方法歸併,最終遞迴完成排序。
二、演算法實現
//雙調歸併過程
template void bitonicmerge(t* pfirst,t* plast,bool bdirection)
} bitonicmerge(pfirst,pfirst+nmid-1,bdirection); //遞迴對陣列前後兩部分元素進行雙調遞迴
bitonicmerge(pfirst+nmid,plast,bdirection); }}
//bitonic排序(雙調排序):屬於排序網路(sorting network)的一種,它是一種可以平行計算的排序演算法。
//首先,雙調序列是指序列要麼先單調遞增然後再單調遞減,要麼先單調遞減然後又單調遞增。
//通過對要排序的陣列構造雙調序列,然後遞迴進行雙調歸併即可完成對陣列的排序
template bool bitonicsort(t* pfirst,t* plast,bool bdirection,compare pfun)
if(pfirst < plast)
if(bisreverse) }
return true;
}
其他排序演算法及資料結構的具體實現詳見github:
Bitonic Sort(雙調排序)
include includeusing namespace std class bitonic sorter bitonic sorter bitonic sorter int a,int len void bitonic sorter sort bool direction void biton...
平行計算實戰 雙調排序
假設序列a是乙個單調遞增序列,b是乙個單調di j遞減序列,那麼由a與b拼接而成的序列c就是乙個雙調序列。如圖1 接下來我們要介紹的乙個概念是雙調 操作 1 將數列的前半部分的各個元素 i值從0到n 2 1 和對應的後半部分的各個元素 i n 2到n 1 做一一比較 2 如果前半部分的元素大於後半部...
雙調排序思想及實現(C語言)
下屬專案 測試用例數量 什麼是雙調排序無0 雙調排序怎麼實現無1 雙調排序是基於四元素排序發展起來的一種排序方法,單純的雙調排序適用於2的冪次方個元素的序列的排序。而選擇排序和氣泡排序都屬於三元素排序。四元素排序的思想是這樣的,比如說有 3,2,1,4 這乙個序列,我們要按照從小到大 公升序 的順序...