在之前的文章裡,我們講解了插入排序,而希爾排序相當於對插入排序的一種優化。在這裡我們簡單回顧下插入排序,插入排序的核心思想是,從陣列首位開始,通過遍歷,將相鄰的兩個元素進行排列,小的元素放在前面,大的元素放在後面,並使用遞迴,將調換位置的元素繼續與前面的元素進行比較,一直到前i個元素有序為止。然後重複上述步驟,一直到陣列末尾。示意圖如下:
我們可以知道,插入排序對於基本有序,或者陣列規模較小的陣列它的效率還是很高的,但是這裡就有乙個問題,現在給出的只是五個數,如果數字數量不斷增多,並且還是無序甚至是倒敘時,那麼插入排序就需要耗費非常多的時間,來不斷進行陣列中元素的移動。由此,我們引出希爾排序。
希爾排序(shellsort)是以它的發明者donald shell名字命名的,希爾排序是插入排序的改進版,實現簡單,對於中等規模資料的處理效能表現還不錯。它的實現思路是:先把較大的資料集合按(增量)分割成若干個小組(邏輯上的分組),然後對每乙個小組分別進行插入排序,這樣插入排序所作用的資料量就會減少很多,插入的效率就會提高。然後減少增量繼續分組,這樣可以將每個組的範圍擴大一些,這樣就做到了有序組跟有序組進行插入排序形成有序陣列的操作,繼續減少增量繼續插入排序,一直到增量為1時,這時候相當於對整個陣列進行插入排序,這時候的陣列,已經做到了基本有序,小的元素在前面,大的元素在後面,這樣插入排序的效率就會提公升非常多。
如圖,對陣列元素進行邏輯上的分組,它們在陣列中的位置還是原來的樣子,並沒有進行分組操作,只是將它們看成這幾個分組。
可以看出它們是按照下標相隔距離(增量)為4分的組。這時候,每個分組進行插入排序,各個分組就變成了了有序的了,但是整體卻還不一定有序,這時候從整體看,小的元素大體在前面,大的元素大體在後面。
然後我們縮小增量為上個增量的一半:2,繼續進行分組操作,這時候每個分組元素多了,但是陣列變的部分有序,插入效率就會很高。
然後執行插入排序,使其每個分組各自有序
然後設定增量為之前的一半:1,則整個陣列被分成一組,但此時整個陣列已接近有序,插入效率會很高。
**實現:
以上就是希爾排序的基本思想及其**實現,希爾排序中對於增量序列的選擇是非常重要的,這直接影響到希爾排序的效能。我們選擇的增量序列最壞時間複雜度依然為o(n^2)。 hibbard提出了另乙個增量序列,這種序列的時間複雜度(最壞情形)為o(n^1.5)
sedgewick提出了幾種增量序列,其最壞情形執行時間為o(n^1.3),其中最好的乙個序列是
演算法基礎之排序篇 希爾排序
1 演算法描述希爾排序是一種遞減增量排序,當增量等於1的時候,就成了插入排序,因此希爾排序的最後一步就是普通的插入排序。操作步驟 1 選擇步長di 1 di n 對待排序列進行分割。所有距離為di的資料分到乙個組。2 對每乙個組進行插入排序。3 遞減步長,重複 1 2 直到步長等於1 2 圖例 3 ...
排序篇 4 希爾排序
前面我們分析的三種演算法,最壞的情況下時間複雜度都是o n 2 下面我們介紹一種可以超越o n 2 的排序演算法。基本思想 希爾排序屬於插入類排序,採用跳躍分割的策略,將相距某個 增量 的記錄組成乙個子串行,這樣才能保證在子串行內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序。所謂的基本...
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...