1、什麼是希爾排序算法
希爾排序(Shell's Sort)是
插入排序的一種又稱「縮小增量排序」,是直接插入排序算法的一種更高效的改進版本。
思路:
希爾排序是把記錄按下標的必定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減小,每組包含的關鍵詞愈來愈多,當增量減至1時,整個文件恰被分紅一組,算法便終止
邏輯:
在希爾排序中最重要的是分組,咱們先找到一個間隔,每隔必定的間隔將這些數字排位一組,
假設有這樣一個數組 [9,1,2,5,7,4,8,6,3,5] ;咱們每隔5個爲一組。那麼這個數組被咱們分紅了如下幾組
第一組:9 4
第二組:1 8
第三組:2 6
第四組:5 3
第五組:7 5
分組完畢後咱們在每隔組的組內進行排序
第一組: 4 9
第二組:1 8
第三組 2 6
第四組 3 5
第五組 5 7
排序後咱們在將這個數組從新設間隔從新進行排序(下一次的間隔減半) 2個爲一組
[4,1,2,3,5,9,8,6,5,7]
第一組:4 2 5 8 5 ==》組內排序 2 4 5 5 8
第二組:1 3 9 6 7 ==》組內排序 1 3 6 7 9
2 1 4 3 5 6 5 7 8 9
排序後咱們在將這個數組從新設間隔從新進行排序(下一次的間隔減半) 1個爲一組最後一次也就是兩兩比較
1 2 3 4 5 5 6 7 8 9
注意:間隔在希爾排序中通常是沒有特別的規定,一般狀況下是數組長度的一半
2、代碼
var arr = [2,5,1,9,0]
//算間隔
var len = Math.floor(arr.length/2)
while(len>0){
for(var i=len;i<arr.length;i++){
var temp = arr[i];
for(var j=i-len;j>=0&&temp<arr[j];j=j-len){
arr[j+len] = arr[j]
}
arr[j+len] = temp;
}
len = Math.floor(len/2)
}