1. 程式人生 > >平行計算實戰-雙調排序

平行計算實戰-雙調排序

1.雙調序列

假設序列A是一個單調遞增序列,B是一個單調di'j遞減序列,那麼由A與B拼接而成的序列C就是一個雙調序列。如圖1:

接下來我們要介紹的一個概念是雙調分裂操作:

1)將數列的前半部分的各個元素(i值從0到N/2-1)和對應的後半部分的各個元素(i+N/2到N-1)做一一比較;

2)如果前半部分的元素大於後半部分的元素,則交換。

如果對C進行分裂操作則可以得到D,如法炮製可以再對D進行分裂操作...依此類推,最終可以得到排好序的序列。也就是說,如果有一個雙調序列,那麼我們就可以非常fa方便的對它進行排序操作。那麼接下來的問題就是怎麼從一個普通序列構建出一個雙調序列了。

2.構造雙調序列

2.1 四個元素的雙調序列構造

我們先來看一個簡單的四個元素的例子。對於四個元素的序列而言,如果前兩個元素能夠單調遞增,後面兩個元素單調遞減,則構成一個雙調序列。那麼不難得到構造的規則:

1)比較前兩個元素,如果第一個元素比第二個元素大,則交換;

2)比較後兩個元素,如果第一個元素比第二個元素小,則交換。

2.2 八個元素的雙調序列構造

八個元素的雙調序列的構造可以分成兩個階段。第一階段將原序列分成前四個元素構成的序列1以及後四個元素構成的序列2。可以通過2.1節介紹的方法分別將序列1和序列2構造成雙調序列。構造完成後進入第二個階段,第二階段如下:

1)在序列1中,比較第一個和第三個元素,如果第一個更大則交換;同樣的比較第二個和第四個元素。然後再對第一個和第二個元素進行比較,如果第一個更大則交換;同樣的比較第三個和第四個;

2)在序列2中進行同樣的操作,只不過交換的規則相反。

階段二是不是很熟悉?就是第1節介紹的雙調序列的排序哈。

如果還是不明白可以看下圖: 

未完待續......

參考文獻 :

【1】三十分鐘理解:雙調排序Bitonic Sort,適合平行計算的排序演算法 https://blog.csdn.net/xbinworld/article/details/76408595