学习笔记:排序算法-希尔排序

901 阅读2分钟

希尔排序概念

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。此段摘自百度百科

希尔排序应用场景

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。

因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择

希尔排序思想(实现步骤)

  1. 将要排序的序列分成若干的子序列
  2. 分别进行插入排序
  3. 等到要排序的序列基本有序时,再对整个序列进行插入排序。

代码实现

shellSort() {
    var arr = [4,5,7,8,1,4,6,2,7,9,343,78,7]
    let gap = Math.floor(arr.length/2)
    while(gap > 0) {
        for(let i = gap; i < arr.length; i++) {
            let temp = arr[i]
            let j = i - gap
            for(; j>=0 && arr[j] > temp; j -= gap) {
                arr[j + gap] = arr[j]
            }
            arr[j + gap] = temp
        }
        gap = Math.floor(gap/2)
    }
    console.log(arr)
}

上面的文字说明不太好理解,可以看看这位大佬的博客点击这里,个人觉得里面做的动画非常的nice!