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
  • 相关阅读:
    Singleton模式
    c++ 的重载、覆盖、隐藏
    Facade模式
    c++ 函数设计
    Adapter模式
    php.ini之完全中文版
    用PHP使Web数据分析进入更高境界
    PHP缩略图生成程序
    PHP例解Webzine编辑和发送
    原创]HTML网页间利用JavaScript通过URL传递变量
  • 原文地址:https://www.cnblogs.com/amou/p/9036960.html
Copyright © 2011-2022 走看看