zoukankan      html  css  js  c++  java
  • 排序算法-(5)希尔排序

    希尔排序

    在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成

    一组,排序完成。

    最坏时间复杂度为O(n^2);最优时间复杂度为O(n);平均时间复杂度为O(n^1.3)。辅助空间O(1)。稳定性:不稳定。希尔排序的时间复杂度与选取的增量有关,选取合适的增量可减少时间复杂度。

    下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,以后每次减半,直到增量为1。

    算法实现

    function shellSort(a) {
        let len = a.length;
        for (let fraction = ~~(len / 2); fraction > 0; fraction = ~~(fraction / 2)) {//fraction为希尔排序中的增量
            for (let i = fraction; i < len; i++) {
                for (let j = i - fraction; j >= 0 && a[j] > a[fraction + j]; j -= fraction) {
                    [a[j],a[fraction+j]]=[a[fraction+j],a[j]];//交换间隔为增量的两个数
                }
            }
        }
    }
  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/wuguanglin/p/shellSort.html
Copyright © 2011-2022 走看看