希尔排序

76 阅读1分钟

希尔排序,第一个突破O(n^2)的排序算法,可以理解成采用分段式的简单插入排序,根据数组长度来拆分每段

实现原理

image.png

可以看出,以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 ]));

大功告成,完事~