zoukankan      html  css  js  c++  java
  • 排序算法之 '希尔排序'

    希尔排序

    希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率很高,因此希尔排序在时间效率 上比直接插入排序有较大提高。

    插入排序是增量为1的希尔排序

    原理图示

    img

    稳定性

    希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小, 插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元 素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的

    Python实现

    def shell_sort(lst):
        length = len(lst)
        gap = length // 2
        while gap >= 1:
            for i in range(gap, length):
                while i > 0:
                    if lst[i] < lst[i - gap]:
                        lst[i], lst[i - gap] = lst[i - gap], lst[i]
                        i -= gap
                    else:
                        break
            gap //= 2
        return lst
    
    
    if __name__ == '__main__':
        lst = [8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
        print(shell_sort(lst))
    
    
     
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  • 相关阅读:
    NFS4.1规范研究:session
    散列冲突与作为特征值的散列
    使用Select的3个注意事项
    3个学习Socket编程的简单例子:TCP Server/Client, Select
    Gdb调试多进程程序
    Usage of pmake
    诡异的bug: tcsh陷入死循环
    【转】PowerDesigner 物理数据模型(PDM) 说明
    大批量文件处理的7条建议
    OLE DB、ODBC 和 Oracle 连接池 (ADO.NET)
  • 原文地址:https://www.cnblogs.com/fengting0913/p/13330787.html
Copyright © 2011-2022 走看看