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