希尔排序,第一个突破O(n^2)的排序算法,可以理解成采用分段式的简单插入排序,根据数组长度来拆分每段
实现原理
可以看出,以gap为分割,依次往后推移,推移前后两数进行比较,完成后gap继续分割,知道为0 终止
代码实现
function shellSort(arr = []){
// 定义gap
let gap = Math.floor(arr.length/2);
while(gap>0){
for(let i=gap;i<arr.length;i++){
let j = gap;
// j>=gap 如果数组是基数 会出现 中间数调换两次 (j 要进行累减)
// 如图片中就是基数,26 中间数就进行了两次置换比较在(i=gap和i=arr.length-1)的时候
while(j>=gap && arr[j-gap]>arr[j]){
[arr[j-gap],arr[j]] = [arr[j],arr[j-gap]]
j-=gap
}
}
// 执行第一步 gap进行再次分割
gap = Math.floor(gap/2);
}
return arr;
}
console.log(shellSort([ 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 ]));
大功告成,完事~