# 回顾插入排序

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

image.png

# 希尔排序

现在,希尔排序在插入排序的基础上,设置了间隔 gap ,实现了分组插入排序

  • 首先取一个整数 d1=n/2 ,将元素分为 d1 个组,每组相邻两元素之间间距为 d1 ,在个组内进行直接插入排序
  • 取第二个整数 d2=d1/2 ,重复上述分组排序过程,直到 di=1 ,即所有元素在同一组内进行直接插入排序

希尔排序每趟并不能使某些元素有序,而是使整体数据越来越接近有序;最有一趟使得所有数据有序。

image.png

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]
更新於 閱讀次數

請我喝[茶]~( ̄▽ ̄)~*

fygod 微信支付

微信支付

fygod 支付寶

支付寶

fygod PayPal

PayPal