希尔(shell)排序是从插入排序改进而来的
以将[9,8,7,6,5,4,3,2,1]从小到大排序为例
首先将步长设为列表长度的一半,将列表分组,得到
[9,5]一组,[8,4]一组,[7,3],[6,2],[1]
但只是这样分,实际上9和5并没有挨在一起,还在原来的位置
然后分别对每一组进行插入排序,但是中间隔着三个数,不能不管,所以每次移动的单位都是步长
将插入排序的时候,我们知道了第一个数可以不管,
而且由分组的规则,导致前(步长)个数分别是每组的第一个数,
所以从第(步长+1)个数开始排序,因为移动单位是步长,所以每组之间不会相互影响,可以同步进行
得到结果[5,4,3,2,9,8,7,6,1]
然后步长取原来的一半,再分组
[5,3,9,7,1],[4,2,8,6]
分别对每组进行插入排序
直到步长小于1时结束
a = [9, 78, 54, 91, 86, 53, 88, 66, 46, 15]
"""步长初始化为列表长度的一半"""
step = len(a)//2
"""当步长 < 1时,排序结束"""
while step >= 1:
"""从第step+1个数开始同时对每组进行插入排序"""
for i in range(step+1, len(a)):
temp = a[i]
j = i-step
while j >= 0 and a[j] > temp:
a[j+step] = a[j]
j = j-step
a[j+step] = temp
"""步长取原来的一半"""
step = step//2
print(a)