雙調排序高階 對任意長度的序列排序(C語言)

2021-08-13 17:59:41 字數 2076 閱讀 3533

下屬專案

測試用例數量

雙調排序回顧+高階無0

高階雙調排序怎麼實現無1

雙調排序是基於四元素排序發展起來的一種排序方法,單純的雙調排序適用於2的冪次方個元素的序列的排序。而選擇排序和氣泡排序都屬於三元素排序。

四元素排序的思想是這樣的,比如說有(3,2,1,4)這乙個序列,我們要按照從小到大(公升序)的順序來排序。

(3,2,1,4)–>(2,3)(4,1)–>(2,1)(4,3)–>(1,2)(3,4)。

以上過程可總結為這樣的規律(實現整體公升序):

第一步,序列等分,第一部分公升序,第二部分降序

第二步,兩個子串行對應元素比較互換;

第三步,對兩個子串行均公升序排序。1

經過個人的思考,我認為原理可用下圖表示:

第一步的公升序和降序是為了找出乙個等位值,第二步把兩個子串行對應位置的元素進行比較,找到這個等位值,把小於等位值的交換到第乙個子串行,大於等位值的交換到第二個子串行,所以第三步中只需要分別對子序列進行排序即可實現整體的排序。

那麼對於不是2的冪次方個元素的序列,我們怎麼能採用雙調排序嗎?通常思路是:把序列補充為有2的冪次方個元素,再採用雙調排序。顯然這種方法非常浪費空間,不建議使用。

我的思路是在原有排序思想上進行一小點的改動。

我們還是以最終實現整體公升序為例。因為對於任意序列,要麼是奇序列,要麼是偶序列。對於奇序列,做以下改進:

第一步,還是等長劃分,但第二個序列會多乙個元素,第一部分公升序,第二部分降序;

第二步,兩個子串行對應元素比較互換,只是其中對應的元素,第二個序列是從第二個元素開始(即子串行一的1號元素對應子串行二的2號元素,子串行一的2號元素對應子串行二的3號元素… …);

第三步,對兩個子串行均公升序排序。

其中關鍵步驟在於第二步,為什麼比較的元素,對於第二個子串行應該從第二個元素開始算呢?

因為在第二步中,我們是要把小於等位值的換到第乙個子串行中,由於第二個子串行是降序排序的,所以最後乙個元素(最小)很有可能被換到第乙個子串行中。你可能會問,那麼第二個子串行的第乙個元素不用考慮嗎?是的,不用考慮!

請你仔細想想,如果這第乙個元素比等位值大,顯然應該留在第二個序列當中,如果比等位值小呢,我們換過去給子串行一的可都是比這個元素小的,可別忘了子串行二是降序排列的,而從子串行一中換過來的又都是比等位值大的(也就大於這個元素,即把子序列一中大於這個元素的都換到了子串行二)。因此經過第二步交換後,子串行一中不可能有元素大於子串行二的第乙個元素。所以第三步還是兩個子串行均公升序即可實現最終的公升序。

#include

#include

#define up 1

#define down 0

#define n 45

void

generatenum

(int

*a,int num)

}void

compare

(int

*a,int

*b,int type)

}else

if(type == down)

}else

printf

("err,type\n");

}void

sort

(int

*a,int num,

int type)

void

main()

以上我增加了乙個隨機生成陣列的函式,而雙調排序的改進,僅僅只需要在sort()函式中加上num%2,即可實現對任意長度的序列進行排序。

**中sort()函式中的注釋:公升與降對應第一步,中間過程對應第二步,公升與公升對應第三步。2

如果本文對你有幫助,不如請我一罐可樂吧 ?

雙調排序回顧+高階

高階雙調排序怎麼實現

方法基於《gpu高效能計算之cuda》–5.1.1. ↩︎

對k個序列按長度由大到小排序 排序演算法(8)

本片文章做為排序演算法系列的擴充套件介紹兩個排序演算法,並行排序和量子排序,不要被名字唬住,讓我們來慢慢來探索吧。雙調排序 bitonic sort 由ken batcher在1968年建立的,是基於比較的並行排序演算法,其主要思想是將隨機序列轉換為雙調序列,即序列單調遞增,單調遞減 移位雙調序列也...

自己寫的 新的 排序演算法 二分對調排序

using system using system.collections.generic using system.linq using system.text namespace 雙選擇排序 雙選擇排序 0,entry.length 1,entry 二分對調 0,entry.length 1,e...

按照給定的字母序列對字元陣列排序

己知字母序列 d,g,e,c,f,b,o,a 請實現乙個方法,要求對輸入的一組字串 input bed dog dear eye 按照字母順序排序井列印。本例的輸出順序為 dear,dog,eye,bed。這道題本質上還是考察對字串排序的理解,唯一不同的是,改變了 比較字串大小的 規則,因此這道題的...