码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构和算法-排序算法-希尔排序

时间:2020-02-23 09:48:16      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:就是   pre   希尔排序   strong   range   结构   class   循环   插入排序   

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

"""

希尔排序
希尔排序就是插入排序的一种改进版本,

算法的步骤
把一个序列不视为一个整体,而是视为多个子序列,
假设间隔是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)

 

数据结构和算法-排序算法-希尔排序

标签:就是   pre   希尔排序   strong   range   结构   class   循环   插入排序   

原文地址:https://www.cnblogs.com/andy0816/p/12348381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!