對資料結構和演算法的總結和思考(三)--希爾排序

johnychen發表於2021-09-09

希爾排序是第一個時間複雜度突破O(n^2)的高階演算法。顧名思義,這就是被希爾發現的一種排序演算法。演算法本質為分組插入排序。具體實現為:

let count = 0;
function shellSort(arr) {
    let gap = 1, times = 2;
    while(gap  0; gap = Math.floor(gap / times)) {
        console.log(gap);
        for (let i = gap; i = 0 && arr[j] > temp; j-= gap) {
                count ++;
                arr[j + gap] = arr[j];
                flag = j;
            }
            arr[flag] = temp;
        }
    }

    return arr;
}
let sortArr = [];
for (let i = 0; i 

我來解析下上面的程式碼。

   let gap = 1, times = 2;
    while(gap 

這一小段程式碼是確認一個間隙值,times是設定間隙值得倍數。此倍數可以任意設定,不過為2的時候相對錶現比較好比較穩定。gap為間隙值,間隙值最後一次一定是1,設定間隙值的目的是為了分割槽比較,例如如果設定為times為2,那麼第一次就是從中間開始左右兩邊比較,左邊放較小值,右邊放較大值,然後依次比較。

for (gap; gap > 0; gap = Math.floor(gap / times)) {
        console.log(gap);
        for (let i = gap; i = 0 && arr[j] > temp; j-= gap) {
                count ++;
                arr[j + gap] = arr[j];
                flag = j;
            }
            arr[flag] = temp;
        }
    }

這一段程式碼就是分割槽進行比較的插入排序。由於是插入排序,排序的初始區間是有序的,所以可以只找到一個正確的插入位置就行,後續的一定是滿足規則的,所以這一行j >= 0 && arr[j] > temp可以這樣寫,當然, arr[j] > temp也可以寫在if語句裡面。

由於是插入排序,很顯然我們可以採用二分查詢法進行最佳化,具體程式碼實現請童鞋們自己動手,如果有困難可以聯絡我,我會在github上附上對應的程式碼。

以上就是希爾排序的全部內容,下一篇為快速排序,thx。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4301/viewspace-2808023/,如需轉載,請註明出處,否則將追究法律責任。

相關文章