概念
希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
- 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率;
- 但插入排序一般來說是低效的,因爲插入排序每次只能將數據移動一位;
希爾排序的基本思想是:先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
算法步驟
具體實現時,首先選定兩個記錄間的距離$gap$
,在整個待排序記錄序列中將所有間隔爲$gap$
的記錄分成一組,進行組內直接插入排序,然後再逐漸縮小增量$gap$
,直至選定兩個記錄間的距離$gap = 1$
爲止,此時只有一個子序列,即整個待排序記錄序列。
代碼實現
function shellSort(arr){
if(!arr && !arr.length){return -1;}
let gap = arr.length + 1;
while(gap > 1){
// 計算元素間間隔
gap = Math.floor(gap / 3) + 1;
// 直接插入部分
for(let i=gap,len=arr.length; i<len; i++){
const curNum = arr[i];
let j = i - gap;
while(curNum < arr[j]){
arr[j+gap] = arr[j];
j-=gap;
}
arr[j+gap] = curNum;
}
}
return arr;
}