輕鬆一刻 什麼是雞尾酒排序和地精排序?

2021-09-11 11:37:53 字數 3202 閱讀 6160

奇葩排序第二彈:)

先來看回顧一下氣泡排序的思想和原理。

氣泡排序的思想

氣泡排序的每乙個元素都可以像小氣泡一樣,根據自身大小,一點一點向著陣列的一側移動。

氣泡排序演算法的原理

一般情況下,可以通過下面的動畫理解氣泡排序。

現在我們來看一組特殊資料如果使用氣泡排序會怎麼樣。

將無序數列:2,3,4,5,6,7,8,1,使用氣泡排序使其從小到大排序。

進行逐步分析:

第一輪操作( 8 和 1 交換 )

第二輪操作( 7 和 1 交換 )

第三輪操作( 6 和 1 交換 )

第四輪操作( 5 和 1 交換 )

第五輪操作( 4 和 1 交換 )

第六輪操作( 3 和 1 交換 )

第七輪操作( 2 和 1 交換 )

仔細觀察上面的這組無序數列,實際上只有 1 的位置不在該在的位置,而 2 ,3 ,4 ,5 ,6 ,7 ,8 都已經有序了,結果使用氣泡排序,需要折騰 7 次才能將 1 歸位。

雞尾酒排序,也就是定向氣泡排序,雞尾酒攪拌排序,攪拌排序(也可以視作選擇排序的一種變形),漣漪排序,來回排序或快樂小時排序,是氣泡排序的一種變形。

此演算法與氣泡排序的不同處在於排序時是以雙向在序列中進行排序。

排序過程:

show me the animation

第一輪操作( 8 和 1 交換 )

第二輪操作 ( 從序列右邊開始遍歷 )

第三輪操作 ( 從左向右比較和交換 )

在這一輪操作中,沒有元素位置交換,證明已經有序,排序結束。

對比 氣泡排序 ,雞尾酒排序只需要 3 輪操作就可以完成排序。

gnome 排序(地精排序),起初由 hamid sarbazi-azad 於 2000 年提出,並被稱為stupid排序,後來被 dick grune 描述並命名為 「地精排序」 。

地精排序和插入排序類似,除了移動乙個元素到最終的位置,是通過交換一系列的元素實現,就像氣泡排序一樣。概念上十分簡單,不需要巢狀迴圈。時間複雜度為o(n2),但是如果初始數列基本有序,時間複雜度將降為o(n)。實際上 gnome 演算法可以和插入排序演算法一樣快。平均執行時間為o(n^2)。

將無序數列:6,2,4,1,5,使用地精排序使其從小到大排序。

通過設計標識 i = 0 ,然後從頭開始判斷,什麼時候 ( i < 4 ) 不成立,什麼時候排序結束。

這裡的核心點就是如何控制 i 的值

第一輪操作「i = 0」

先讓 i 自增 1 ,達到值為 1 才開始比較 :

交換前 [ 6 2 4 1 ] 『i = 0

交換後 [ 6 2 4 1 ] 『i = 1

第二輪操作「i = 1」

比較 6 和 2 ,發生交換,只要發生交換 i 就減 1

交換前 [ 6 2 4 1 ]『 i = 1 』

交換後 [ 2 6 4 1 ]『 i = 0 』

第三輪操作「i = 0」

i 變成 0 了,啥也不幹,自增變成 1 再說。

交換前 [ 2 6 4 1 ]『 i = 0 』

交換後 [ 2 6 4 1 ]『 i = 1 』

第四輪操作「i = 1」

比較 2 和 6 ,不交換,只要不要換就自增 1

交換前 [ 2 6 4 1 ]『 i = 1 』

交換後 [ 2 6 4 1 ]『 i = 2 』

第五輪操作「i = 2」

比較 6 和 4 ,發生交換,只要發生交換 i 就減 1

交換前 [ 2 6 4 1 ]『 i = 2 』

交換後 [ 2 4 6 1 ]『 i = 1 』

第六輪操作「i = 1」

比較 2 和 4 ,不交換,只要不要換就自增 1

交換前 [ 2 6 4 1 ]『 i = 1 』

交換後 [ 2 4 6 1 ]『 i = 2 』

第七輪操作「i = 2」

比較 4 和 6 ,不交換,只要不要換就自增 1

交換前 [ 2 4 6 1 ]『 i = 2 』

交換後 [ 2 4 6 1 ]『 i = 3 』

第八輪操作「i = 3」

比較 6 和 1 ,發生交換,只要發生交換 i 就減 1

交換前 [ 2 4 6 1 ]『 i = 3 』

交換後 [ 2 4 1 6 ]『 i = 2 』

第九輪操作「i = 2」

比較 4 和 1 ,發生交換,只要發生交換 i 就減 1

交換前 [ 2 4 1 6 ]『 i = 2 』

交換後 [ 2 1 4 6 ]『 i = 1 』

第十輪操作「i = 1」

比較 2 和 1 ,發生交換,只要發生交換 i 就減 1

交換前 [ 2 1 4 6 ]『 i = 1 』

交換後 [ 1 2 4 6 ]『 i = 0 』

第十一輪操作「i = 0」

啥也不幹,先讓 i 自增1,達到值為 1 才開始真正的比較。

『 i = 1 』時,比較 1 和 2 ,不交換,只要不交換就自增 1 。

『 i = 2 』時,比較 2 和 4 ,不交換,只要不交換就自增 1 。

『 i = 3 』時,比較 4 和 6 ,不交換,只要不交換就自增 1 。

『 i = 4 』時,表示式 ( i < n ) 不成立,排序結束。

順序輸出為 [ 1 2 4 6 ]。

地精排序演算法**

template void gnome_sort_1(t data, int n, bool comparator(t, t))else

}}複製**

這種地精排序演算法還有很多優化的空間,這裡小吳就不展開來講了。

雞尾酒排序和地精排序雖然被程式設計師小吳歸為奇葩排序一類,但是它們還是有一定的使用場景的。

除了雞尾酒排序和地精排序以外,你還知道哪些排序適合用於「大部分元素有序」的序列進行排序?

終於輕鬆一刻了,歸來

已經好久沒寫隨筆了,這段時間很忙,作為乙個大學生,學習還是很重要的,我不想掛科,當然大部分人也不想掛。前段時間有幾門專業課考試,課程不是太難,但對於我這個上課不認真聽講的小痞來說就如同天書了,怎麼辦?唯一的出路就是考前突襲,想必你也是滴。我的突襲就像是從頭學一樣,無頭蒼蠅,不知道重點,還好班裡學習好...

期待的一刻

我期待的一刻 大學的我們每天想很多事情,但往往是雜亂無章的。如果我們把想達到的目的寫在紙上,目標就變得很明確 這樣我們會全力以赴。開篇語 進入大學,看到繽紛的宣傳海報,還有那張讓我一輩子都難忘的招新海報 社團聯合委員會招新,於是我就下定決心去加入這個組織的宣傳部,因為我要學習到過去宣傳工作上沒有學習...

每日開心一刻 2004 10 31

某人擅用筆記型電腦,聽朋友說滑鼠比軌跡球好用,就向朋友借了乙隻回家試。因不得要領,電其友人。某甲 滑鼠比軌跡球難用,滑了半天,才動一點,而且按鍵在背面,非常不方便 一位在美的留學生,想要考國際駕照。在考試時因為過於緊張,看到地上標線是向左轉。他不放心的問道 turn left?監考官回答 right...