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
  • 相关阅读:
    docker容器打包、镜像文件导入与导出 , 支持批量
    服务器高并发配置优化
    php集成财付通支付接口
    C# 防界面假死
    以二进制方式读取图片保存到string
    转载 C#开发串口总结,并提炼串口辅助类到公用类库中
    C# comport 打印图像
    C#实现MD5加密
    execute sp_executesql 用变量获取返回值
    C# 获取计算机cpu 硬盘 网卡信息
  • 原文地址:https://www.cnblogs.com/amou/p/9036960.html
Copyright © 2011-2022 走看看