js希尔排序

388 阅读1分钟

希尔排序又名缩小增量排序,算是插入排序的增强版.

基本思想: 把记录按照步长gap分组, 对每次分完组后采用直接插入排序方法进行排序

1.gap的值从哪取?

答:Math.floor(arr.length / 2 ) = gap (即取数组长度的一半,取舍)

2.gap会变吗? 答: gap的值会变,是上次gap值的一半取舍 Math.floor(gap / 2 ) = gap

3.当gap === 1时怎么办? 答: 当gap === 1,就对整个数组进行一次排序,出来的排序结果就是最后的结果

代码来了👇👇👇

function shellSort(array) { // 希尔排序
    let gap = Math.floor(array.length / 2); // 计算gap值

    while (1 <= gap) { // 当gap>=1 符合条件
        // 把距离为 gap 的元素编为一个组,扫描所有组
        for (let i = gap; i < array.length; i++) {
            let j = 0;
            let temp = array[i]; // 中间值

            // 对距离为 gap 的元素组进行排序
            //  j >= 0 是为了保证 后一个元素i在中间值gap位置之后
            //  temp < array[j] 是为了判断 后一个值大于前一个值才进行换位置
            for (j = i - gap; j >= 0 && temp < array[j]; j -= gap) { 
                array[j + gap] = array[j];
            }
            array[j + gap] = temp;
        }
        gap = Math.floor(gap / 2); // 减小增量
    }
    return array;
}