希尔排序
分组过程:总共有9个元素,d=9/2=4,把数据分成d=4组,每组相邻元素距离为4,如0-4-8。
然后对每一组进行插入排序,排序完后放回原来位置,改变间隔d=2,再重新分组。
插入排序完后再放回去,再将间隔改为d=1,直接插入排序得到最终有序的数据。
排序过程演示:
由此可知,每经过一趟,整体的数据越来越接近有序。
代码实现:
def insert_sort_gap(li,gap):
for i in range(gap, len(li)): #i 表示摸到的牌的下标
tmp = li[i]
j = i - gap #j指的是手里的牌的下标
while j >= 0 and li[j] > tmp:
li[j+gap] = li[j]
j -= gap
li[j+gap] = tmp
print(li)
def shell_sort(li):
d = len(li)//2
while d>=1:
insert_sort_gap(li,d)
d //= 2
时间复杂度:
取不同的gap组合复杂度也不一样,有一些时间复杂度无法知道,最近依然有人在研究。