zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序

    描述:

    希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。是将整个序列分割成若干小的子序列分别进行插入排序

    原理:

    希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

    时间复杂度:

    最优时间复杂度:根据步长序列的不同而不同
    最坏时间复杂度:O(n2)

    稳定性:

    不稳定

    由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

    希尔排序演示:

    代码实现:

    简洁版:

    def Shell_sort(L):
        n = len(L)
        step = len(L) // 2
        while step > 0:
            for i in range(step, n):
                while i >= step and L[i] < L[i - step]:
                    L[i], L[i - step] = L[i - step], L[i]
                    i -= step
            step //= 2
        return L
    View Code

    注释版:

    def shell_sort(L):
        n = len(L)
        step = len(L) // 2
        while step > 0:
            for i in range(step, n):
                while i >= step and L[i] < L[i - step]:
                    L[i], L[i - step] = L[i - step], L[i]
                    i -= step
    
            step //= 2
        return L
    
    # 最一层循环控制所有步长的情况, 如果步长大于0, 即: 步长大于等于1, 则执行循环体
    # 第二层循环控制一个步长的情况, 一个步长分N多个序列
    # 第三层循环控制一个序列, 在这个序列内, 执行直接插入排序的代码, 如果当前元素小于前驱元素, 则交换位置, 然后前移, 再次比较
    # 执行完一个步长后, 步长减半继续执行, 直到步长大于等于1
    
    if __name__ == "__main__":
        l = list(i for i in range(0, 100000))
        print("洗牌之前的列表:" + str(l))
        random.shuffle(l)
        print("洗牌之后的列表:" + str(l))
        print("希尔排序之后:" + str(shell_sort(l)))
    View Code
  • 相关阅读:
    Bootstrap 学习笔记 之网格系统
    自定义属性建立匹配、对应关系——JS学习笔记2015-5-27(第40天)
    CSS那些事儿——关于如何提高编写代码的能力
    自定义属性,匹配数组内容——JS学习笔记2015-5-26(第39天)
    css学习之幻灯片(轮播图)原理
    自定义属性,第一节——JS学习笔记2015-5-25(第38天)
    字体不同,造成的显示异常
    浮动相关理解,以及清除浮动的方法总结
    border实现三角箭头
    go mode
  • 原文地址:https://www.cnblogs.com/amou/p/9036960.html
Copyright © 2011-2022 走看看