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]];//交换间隔为增量的两个数
                }
            }
        }
    }
  • 相关阅读:
    老外写的js闭包
    List<Object> 转为 List<MyClass>
    html 自定义属性
    js 中的算术运算
    System.Web.Mvc.Html 命名空间小计
    历时半年,发布最完整的代码生成器CodeBuilder最新版本
    CodeBuilder之Template接口
    CodeBuilder之Tool接口
    FaibClass.Data
    轻量的Json序列化
  • 原文地址:https://www.cnblogs.com/wuguanglin/p/shellSort.html
Copyright © 2011-2022 走看看