标签:就是 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