背景
希尔排序,作为八大排序算法之一,也是面试常考的算法。 它属于插入排序中的一种,总的看来,主要是通过缩小增量因子来实现对数组进行分组插入排序。这样看来,就很简单了。 如果我们将简单插入排序算法看作是增量为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;
}
怎么样,是不是非常简单呢。