Shell排序演算法:一種經過改良的插入排序演算法

來源:互聯網
上載者:User

Shell排序演算法最初是由D.L Shell於1959年提出,假設要排序的元素有n個,則每個進行插入排序是 並不是所偶的元素同時進行,而是去一段間隔。

Shell首先將間隔設定為n/2,然後跳躍的進行插入排序,再來將間隔設定為n/4,跳躍進行排序動作 ,再來設定時間間隔為n/8、n/16,知道間隔為1之後的最後一次排序終止,由於上一次的排序動作都會 將固定間隔內的元素排序好,所以當間隔為1之後的最後一次排序終止,由於上一次的排序動作都會將 固定間隔內的元素排序好,所以當間隔越來越小時,某些元素位於正確位置的幾率越高,因此最後幾次 的排序動作將可以大幅減低。

舉個例子來說,假如有一未排序的數字如右:89 12 65 97 61 81 27 2 61 98

數位總數共有10個,所以第一次我們將間隔設定為10/2=5,此時我們對間隔為5的數字進行排序, 如下所示:

總結連線的部分表示要一起進行排序的部分,再來將間隔設定為5/2的商,也就是2,則第二次的插 入排序對象如下所示:

再來間隔設定為2/2=1,此時就是單純的插入排序了,由於大部分的元素都已大致排序過了,所以最 後一次的插入排序機會沒有什麼排序動作了:

將間隔設定為n/2是D.L Shell最初所提出,在教科書中使用這個間隔比較好說明,然而Shell排序法 的關鍵在於間隔的設定,例如Sedgewick證明選用以下的間隔可以加快Shell排序演算法的速度:

其中4*(2j)2 + 3*(2j) + 1不可超過元素總數n值,使用上式找出j後代入4*(2j)2 + 3*(2j) + 1求 得第一個間隔,然後將2j除以2代入求得第二個間隔,再來依次類推。

後來還有人證明有其它的間隔選定方法可以將Shell排序演算法的速度再加快;另外Shell排序演算法的 概念也可以用來改良冒泡排序演算法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.