希尔排序是一种分组插入排序算法
- 首先取一个整数
$d_1$ = n/2
, 将元素分为$d_1$
个组,每组相邻量元素之间距离为$d_1$
,在各组内进行直接插入排序 - 取第二个整数
$d_2$= $d_1$/2
,重复上述分组排序过程,直到$d_1$
,即所有元素在同一组内进行直接插入排序 - 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序
n是列表的长度
增量用gap代表,可以第一次增量3是将数据分3组
5后面数4个,到3是4个数(7、4、6、3)
每组去比较大小,分了4组
第二步骤
间隔为2是一组
每组去比较大小
gap就是分的组
排序的是gap分组后的分组序列
#插入排序,把原来的1都改成gap
def insert_sort_gap(li, gap):
#这里从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
def shell_sort(li):
#长度除以2
d = len(li) // 2
while d >= 1:
#循环做一次li,gap传d进来,d在除以2 如果等于1就结束了
insert_sort_gap(li, d)
d //= 2
li = list(range(1000))
import random
random.shuffle(li)
shell_sort(li)
print(li)
希尔排序的复杂度讨论比较发杂,并且和选取的gap序列有关