iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Software Development

少女人妻在廚房裡想不通的演算法系列 第 16

【在廚房想30天的演算法】Day 16 演算法 : 排序 sort III 希爾、搖晃、基數

  • 分享至 

  • xImage
  •  

Aloha!又是我少女人妻 Uerica ~ 我每天看到時間快接近午夜 12 點,都能感受到灰姑娘的慌張,仙杜瑞拉跟王子跳舞到一半急急忙忙地跑回家,是因為她還沒發鐵人賽文章!

希爾排序法 Shell Sort

又稱 遞減增量排序法 diminishing increment sort。希爾排序法是插入排序法 insertion Sort 的改良版,前面提過,插入排序法用在排序完全是亂數的元素效率是很低的,所以用此方法來解決。

延伸閱讀:Day 14 排序 sort 演算法 I : 介紹、氣泡、選擇、插入

希爾排序法的作法是由大到小選擇數個間距 Gap,資料依據選擇的間距將元素分組,分別進行插入排序,反覆操作直到最後一個間距為 1 為止,間距的選擇對執行效率會有很大的影響。

常見的 Gap

  • Shell 原本的 Gap:N/2、N/4、...1 (N為數列長度)
  • Hibbard 的 Gap:1、3、7、...、2k-1
  • Knuth 的 Gap: 1、4、13、...、(3k - 1) / 2
  • Sedgewick 的 Gap: 1、5、19、41、109...

希爾排序法 Shell Sort 操作圖解

  • 首先取一個未排序數列,數列元素有 8 個 (N = 8) ,第一次排序的 Gap 取 N/2 = 8/2 = 4。
    38T01SO

  • 因 Gap 是 4,表示每四個為一組相互比較,所以第 0 個與第 4 個元素比較並排序。
    tRTF5uz

  • 比較後發現因 56 大於 12,所以 12 與 56 交換位置。
    zdzW7t1

  • 結束後,繼續下一組元素的比較,比較第 1 個與第 5 個元素,因 1 小於 49 所以位置不變。
    B4lCbRK

  • 再繼續下一組元素的比較,因 33 大於 20 ,所以 20 與 33 交換位置。
    smNAdO6
    aT0KvTT

  • 結束後,再繼續下一組元素的比較,因 7 小於 51 所以位置不變。已經比較到最後一個元素,所以第一回合結束。
    bVTSKnM

  • 結束第一回合後,將 Gap 縮小,此時 Gap 取 N/4 = 8/4 = 2,表示每兩個為一組比較。如下圖,第 0 個與第 2 個比較,因 12 小於 20 所以維持不變。
    KlUbFPi

  • 再下一組, 1 小於 7 ,所以維持不變。
    BatRM3W

  • 再下一組, 20 小於 56 ,所以維持不變。
    NWSz1VP

  • 再下一組, 7 小於 49 ,所以維持不變。
    GIQWCHa

  • 再下一組, 56 大於 33 ,所以將 33 與 56 交換位置,如同插入排序法,往前插入後,要再比較前一個位置的元素,如下圖因 20 小於 33 ,所以維持不變。
    hcryBVs
    lNWb8q1
    1fgpWzZ

  • 再回來比較下一組元素,因 49 小於 51 所以維持不變。比較到最後一個元素,所以第二回合結束。
    qbSl7z8

  • 再將 Gap 縮小至 1 ,表示鄰近的兩個元素為一組互相做比較並排序。如下圖第 0 個與第 1 個位置做比較。因 12 大於 1 ,所以 1 與 12 交換位置。
    uRFCGqW
    GKOoNCc

  • 再比較下一組元素,12 小於 20,所以位置維持不變
    tBAgLXx

  • 再比較下一組元素,20 大於 7 所以位置交換。交換後如同插入排序法,7要再往前一個元素比較,因 12 大於 7,所以 7 再與 12 交換。7 再往前一個元素比較,因 1 小於 7 所以維持不變。
    J4myoMX
    FFLq38T
    aHNNiPS
    YDCyrgt

  • 再比較下一組元素...
    HJKTBIG
    SN9TtN4
    ewOTE1R

  • 因 56 大於 51 ,所以需交換位置。交換後需再往前比較,因 49 小於 51 所以維持不變。
    H4cf5ns
    MlrMs0V
    SML8YZL

  • 將啷~這樣整個希爾排序法就完成啦!484 很簡單啊!
    NChAuqZ

雙向氣泡排序法 Bidirectional Bubble Sort

又稱 搖晃排序法 Shaker Sort、雞尾酒排序法Cocktail Sort,在這邊我使用雙氣泡排序這個名稱較為好懂,顧名思義就是氣泡排序法的改良版,原本的氣泡排序法只從一個方向做比對,而雙向氣泡排序法則是兩邊來回反覆操作,直到排序完成為止。

延伸閱讀:Day 14 排序 sort 演算法 I : 介紹、氣泡、選擇、插入

雙向氣泡排序法 Bidirectional Bubble Sort 操作圖解

  • 首先取一個未排序元素數列如下
    w20nQo5

  • 跟氣泡排序法一樣,先由右往左開始兩兩比對。若左邊元素小於右邊元素位置不變。
    JqSRcnG
    KrtpHXz

  • 若左邊元素大於右邊元素則兩兩交換。下圖 3 大於 1 ,所以兩元素交換。
    udSg05U
    4yvTio3

  • 繼續向前比對,因 5 大於 1 ,所以兩元素交換。
    Xkx0wUD
    VhCtBO3

  • 最小值已排序到最左邊,第一回合結束。
    h6XGRzU

  • 與氣泡排序法不同之處,第二回合由左往右開始。若左邊元素大於右邊元素則做交換。因 5 大於 3 ,所以兩兩交換。
    rB9kNn2
    eMT0FMt

  • 因 5 大於 2 ,所以兩兩交換。
    4DuOZhl
    kjErrOZ

  • 因 5 大於 4 ,所以兩兩交換。
    AGG7wiW
    L0t78Dw

  • 此時最大值已排到最右邊,第二回合結束
    ZBn7WZM

  • 此時再從右往左開始比對,左邊元素小於右邊元素位置不變。
    Y56gEar

  • 若左邊元素大於右邊元素則兩兩交換,因 3 大於 2 ,所以兩元素交換。
    9XLZ6Ah
    lVh9R2C

  • 第三回合結束!排序就完成了,比原本的氣泡排序法省了很多時間呢!
    K6h2IXa

基數排序 Radix Sort

基數排序法與前面的排序法不同,基數排序法不用通過元素相互比較來做排序,且可用在多鍵值的元素排序,如兩個鍵值 (1,2)、(2,4)、(3,2),或撲克牌 (梅花,3)、(方塊,7)等,屬於較為特殊的排序法。

基數排序法是用桶子 Bucket 來將元素分類,並依照每個位數來做排序,元素的基底為多少就需準備多少個桶,若元素為數值,基底則為進制。例如 10 進位的數值則準備 10 個桶子,16 進位則是 16 個桶子,以此類推。

依照位數排序的先後順序,可分為兩種:

  • LSD Least significant digit:小位數排到大。
  • MSD Most significant digit:最大位數排到小。

參考資料:

Rust Algorithm Club

[演算法] 排序演算法(Sort Algorithm)

維基百科: 排序演算法


好的~~感謝閱讀!大家掰掰明天見啦!再不發文我的馬車也要變南瓜跟老鼠了!


上一篇
【在廚房想30天的演算法】Day 15 演算法 : 排序 sort II 堆積、合併、快速
下一篇
【在廚房想30天的演算法】Day 17 演算法 : 搜尋 search I 線性搜尋、二分搜尋
系列文
少女人妻在廚房裡想不通的演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言