【JavaScript算法】---希爾排序(轉載自個人老師 Alley-巷子)

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)
}
複製代碼
相關文章
相關標籤/搜索