說說雙調排序

2021-06-19 03:11:11 字數 1464 閱讀 9384

一、簡介

雙調排序(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 這乙個序列,我們要按照從小到大 公升序 的順序...