回顾插入排序
def insertSort(li):
for i in range(1,len(li)): #i表示摸到的牌的下标,注意循环从1开始,因为手里的牌是0
tmp=li[i]
j=i-1 #j表示手里的牌的下标
while j>=0 and li[j]>tmp: #如果手里的牌比tmp小或者手里已经没有牌了,结束循环
li[j+1]=li[j]
j-=1
li[j+1]=tmp
希尔排序
现在,希尔排序在插入排序的基础上,设置了间隔gap,实现了分组插入排序
- 首先取一个整数
d1=n/2,将元素分为d1个组,每组相邻两元素之间间距为d1,在个组内进行直接插入排序 - 取第二个整数
d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序
希尔排序每趟并不能使某些元素有序,而是使整体数据越来越接近有序;最有一趟使得所有数据有序。
def insertSort_gap(li,gap):
for i in range(gap,len(li)): #i表示摸到的牌的下标,注意循环从gap开始,因为手里的牌是0~(gap-1)
tmp=li[i]
j=i-gap #j表示手里的牌的下标
while j>=0 and li[j]>tmp: #如果手里的牌比tmp小或者手里已经没有牌了,结束循环
li[j+gap]=li[j]
j-=gap
li[j+gap]=tmp
def shell_sort(li):
d=len(li)//2
while d>=1:
insertSort_gap(li,d)
d//=2
# 验证
import random
li=list(range(10))
random.shuffle(li)
print(li)
shell_sort(li)
print(li)
[1, 9, 8, 5, 2, 0, 4, 6, 7, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]