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

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

"""

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

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

猜你喜欢

转载自www.cnblogs.com/andy0816/p/12348381.html