介紹
今天介紹第二種插入排序
——希爾排序
,該方法因D.L.Shell
于1959年提出而得名,是第一個時間復雜度突破O(n^2)
的排序算法,又叫縮小增量排序
,在待排序數據量越大,希爾排序
較直接插入排序
的優勢就越加明顯,但也是前面介紹幾種算法中較難理解的一種。算法邏輯(升序為例):
初始時,有一個大小為 10 的無序序列:
1.在第一趟排序中,我們不妨設 gap1 = N / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。
2.接下來,按照直接插入排序的方法對每個組進行排序。
在第二趟排序中,我們把上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數)。這樣每相隔距離為 2 的元素組成一組,可以分為 2 組。
3.按照直接插入排序的方法對每個組進行排序。
4.在第三趟排序中,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為 1 的元素組成一組,即只有一組。
5.按照直接插入排序的方法對每個組進行排序。此時,排序已經結束。
希爾排序
例子
假設有一個待排序數組[77, 6, 37, 96, 34, 6, 14]
, js實現如下(升序):
function shellSort(arr) {
var len = arr.length,
temp,
gap = 1;
while(gap < len/5) { //動態定義間隔序列
gap =gap*5+1;
}
for (gap; gap > 0; gap = Math.floor(gap/5)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
return arr;
}
sort([77, 6, 37, 96, 34, 6, 14]); // =>[6, 6, 14, 34, 37, 77, 96]
時間復雜度
時間復雜度為O(n^1.3)
。
感謝閱讀!歡迎關注!持續更新中...