希尔排序

402 阅读1分钟

1. 希尔排序

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。 --引自菜鸟教程

1.1 我理解的希尔排序

首先希尔排序是插入排序的一种。希尔排序是建立在分组中的插入排序,所以,要先将排序序列进行分组。每组大小可以是排序序列的长度除以2。然后再进行插入排序。第一分组执行完毕,再以第一次分组的大小除以2进行分组,然后再进行插入排序,以此反复直到分组的大小小于1.

未命名文件 (11).png

未命名文件 (12).png

未命名文件 (13).png

1.2 代码实现

function shellSort(arr) {
    const len = arr.length;
    let groupNumber = Math.floor(len / 2);

    while (groupNumber >= 1) {

        for (let i = groupNumber; i < len; i++) {
            let temp = arr[i];
            let j = i - groupNumber;
            for (; j >= 0 && arr[j] > temp; j-=groupNumber) {
                arr[j + groupNumber] = arr[j];
            }
            arr[j + groupNumber] = temp;
        }
        groupNumber = Math.floor(groupNumber / 2);
    }
    return arr;
}