zoukankan      html  css  js  c++  java
  • 数据结构和算法-排序算法-希尔排序

     ##################     希尔排序        ########################

    """
    
    希尔排序
    希尔排序就是插入排序的一种改进版本,
    
    算法的步骤
    把一个序列不视为一个整体,而是视为多个子序列,
    假设间隔是gap=4
    alist = [54,26,93,17,77,31,44,55,20]
    54,26,93,17,77,31,44,55,20
    54          77          20  这是1 组,间隔是4,
       26          31           这是2 组,间隔是4,
          93          44        这是3 组,间隔是4,
             17          55     这是4 组,间隔是4,
    
    然后对每一组进行插入算法的排序,
    [54  77  20],认为54是第一个,然后后面的每一个去和前面比较,进行插入,--------[20  54   77 ]
    
    全部都排序完成之后,再次合并成为一个序列,
    然后变化间隔, 比如是gap = 2,再次进行插入算法的排序,
    
    进行之后还是再次合并成为一个整体序列
    再次调整gap,比如gap=1 ,然后再次排序,直到排序完成,
    
    
    
    """

    ##################     希尔排序        ########################

    
    # 第一版:
    def shell_sort(alist):
        n=len(alist)
        gap = n //2
        while gap > 0 :
            # 这个最外层的循环是控制gap的,越来越小,
            for j in range(gap,n):
                i = j
                while i>0:
                    if alist[i] < alist[i - gap]:
                        alist[i], alist[i - gap] = alist[i - gap], alist[i]
                        i -= gap
                    else:
                        break
            # 缩短gap步长,
            gap //=2
    
    # 第二版:
    def shell_sort2(alist):
        n = len(alist)
        # 初始步长
        gap = n // 2
        while gap > 0:
            # 按步长进行插入排序
            for i in range(gap, n):
                j = i
                # 插入排序
                while j>=gap and alist[j-gap] > alist[j]:
                    alist[j-gap], alist[j] = alist[j], alist[j-gap]
                    j -= gap
            # 得到新的步长
            gap = gap / 2
    
    if __name__ == '__main__':
    
        alist = [54,26,93,17,77,31,44,55,20]
        shell_sort(alist)
        print(alist)
  • 相关阅读:
    img标签为什么可以设置宽高
    高度和宽度的操作
    自增自减运算符
    读取标签内容:innerHTML和innerText的区别 text()和html()的区别
    js中的常用方法
    js中style,currentStyle和getComputedStyle的区别以及获取css操作方法(考虑兼容性和局限性)
    IE盒模型与W3C盒模型区别
    css四种定位方式及其区别
    css隐藏元素的方法何区别
    Hibernate之HQL
  • 原文地址:https://www.cnblogs.com/andy0816/p/12348381.html
Copyright © 2011-2022 走看看