背景
希爾排序,作爲八大排序算法之一,也是面試常考的算法。 它屬於插入排序中的一種,總的看來,主要是通過縮小增量因子來實現對數組進行分組插入排序。這樣看來,就很簡單了。 如果我們將簡單插入排序算法看作是增量爲1的希爾排序,那麼增量爲n的希爾排序也就不難理解了。
簡單插入排序(最簡版的希爾排序)
function insertSort(arr){
for(let i=1; i < arr.length; ++i){
// 從後向前比較
let tmp = arr[i];
let j = 0;
for(j=i;j > 0 && arr[j-1] > arr[j];--j){
arr[j] = arr[j-1];
}
arr[j] = tmp;
}
return arr;
}
複雜希爾排序
通過上面的簡單插入排序,我們可以發現縮量因子爲1,那麼如果說複雜希爾排序是縮量因子爲gap的插入排序,那麼代碼可以是這樣:
function shellSort(arr){
// 確定縮量因子,進行分組
let gap = 1;
while(gap < arr.length / 3){
gap = gap * 3 + 1;
}
for(;gap > 0; gap = Math.floor(gap / 3)){
// 引入上面的簡單插入排序即可, 用gap去替換1,即可得
for(let i=gap; i < arr.length; i++){
// 從後向前比較
let tmp = arr[i];
let j = 0;
for(j=i;j > 0 && arr[j-gap] > arr[j];j -= gap){
arr[j] = arr[j-gap];
}
arr[j] = tmp;
}
}
return arr;
}
怎麼樣,是不是非常簡單呢。