希爾排序是以它的創造者(
donald shell
)命名的,他是在插入排序基礎上的乙個高階排序。插入排序的原理是在已經排好的序列中,逐個比較相鄰元素,然後在現有序列中找到自己應該插入的位置,然後插入就好了。而希爾排序的原理是: 先將整個待排元素序列通過一定的間隔(序列中元素的間隔)分割成若干個子串行 ,對這些小的子串行分別進行直接插入排序,然後依次縮減間隔再進行排序,待整個序列中的元素基本有序(間隔足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比直接的插入排序有較大提高。
要想更好的理解還是來看看乙個栗子(話說栗子是個好東西,對身體好!!)吧:
以n = 10的乙個簡單陣列為例,我要需要把陣列中的資料公升序排列。如圖
第一次: gap = 10 / 2 = 5
根據間隔,我們從陣列中第乙個元素6開始,把陣列按照間隔分成五份:(6,5),(0,8),(2,0),(9,5),(3,4)。對分好的五個子串行從右到左進行插入排序,得到下面的結果
第二次 :gap = 3
第二次根據3個間隔進行排序,我們按照同樣的方式(5,5), (0,3),(0,6),(5,8),(3,2),(6,9),(8,4)。通過這一次從右到左的插入排序之後,你會看到如下的結果:
第三次 :gap = 3 / 2 = 1
這一次的排序就是我們常見的普通的插入排序了。。
關於第二次的間隔你也可以設定成2,或者是多增加一次間隔排序第二次間隔為3,第三次間隔為2也行。。。只要是最後一次的間隔是1才能達到我們想要的排序效果,也就變成了普通的插入排序了
完整的**如下:
開啟瀏覽器的console檢視結果。
關於間隔的計算:
《演算法(第
4 版)》(人民郵電出版社)的合著者
robert sedgewick
定義了乙個
shellsort()函式,在這個函式中可以通過乙個公式來對希爾排序用到的間隔序列進行動態計算。sedgewick
的演算法是通過下面的**片段來決定初始間隔值的,我們重寫希爾排序過程如下:
//在上面的**中動態間隔序列的希爾排序
this.shellsort2 = function
()
while (gap >= 1)
}gap = (gap - 1)/3;
} };
var length = this再加上外迴圈中的:.datastore.length;
var gap = 1;
while (gap < length/3){
gap = (3 * gap) + 1;
}
gap = (gap - 1)/3;就是sedgewick 動態計算間隔的完整過程了。
排序演算法之希爾排序
希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...
排序演算法之希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...
排序演算法之希爾排序
希爾排序,突破了 通過交換相鄰元素進行排序的任何演算法平均需要 n 2 的二次時間限制 通過比較相距一定間隔的元素來工作。使用乙個增量序列 h1 1,h2,ht,在使用乙個 增量h的一趟排序後,對於每乙個i滿足pdata i pdata i h 即此時序列是h排序的 各趟 比較所用的距離逐漸減小,直...