希尔排序思路
- 希尔排序是一种分组插入排序算法
- 首先取一个整数
d=n/2
,将元素分为d个组,每组相邻两个元素距离为d,各组内进行插入排序 - 接着取第二个整数
d=d/2
,重复上面分组排序过程,直到d=1,即所有元素都在一个组内进行插入排序 - 希尔排序每趟(取一次分组排序完)不能使元素变成有序,但是使整体数据越来越接近有序。最后一趟即
d=1
排序使得所有数据有序。
原数据:5 9 7 3 8 1 4 0 2
示例d=4排序演示:
为什么要分组
分组是为了防止出现插入排序中某个非常小的数插入时前面所有元素(从小到大)都要移动,比如示例中第二组元素1分组后只要移动很少的步数,加快了插入的速度。
示例中,当d=1时,列表变成[4,0,5,1,7,2,8,3,9]
,此时插入的复杂度相对初始列表会低很多。
代码实现
#插入排序将1替换成d
def insert_sort_gap(li,d):#从d下标开始,可以对照上面的示例图,即从元素8开始
n = len(li)
for i in range(d,n):
tmp = li[i]
j = i - d
while j >=0 and li[j] > tmp:
li[j+d] = li[j]
j -= d
li[j + d] = tmp
li = [5,9,7,3,8,1,4,0,2]
d = len(li) // 2
while d > 0:
insert_sort_gap(li,d)
d = d // 2
print(li)
>>>[0, 1, 2, 3, 4, 5, 7, 8, 9]
时间复杂度
相比插入排序提升很大,但是比快速排序、归并排序、堆排序慢
具体的计算方式可以自行查阅