希爾排序
希爾排序(Shell Sort)是一種分組插入排序算法
希爾排序過程:
- 首先取一個整數d1=n/2, 将元素分為d1個組,每組相鄰量元素之間距離為d1,在各組内進行直接插入排序;
- 取第二個整數d2=d1/2,重複上述分組排序過程,直到d1=1,即所有元素在同一組内進行直接插入排序。
- 希爾排序每趟并不使某些元素有序,而是使整體資料越來越接近有序;最後-趟排序使得所有資料有序。
示意GIF:
GIF中我隻展示了如何進行分組,比如d=4的時候,分為4組,即4個清單,每個清單中都用選擇排序進行排序。
廢話不多說,上代碼:
'''
TOP: 希爾排序
author: Blue
time: 2020-08-07
QQ: 2458682080
'''
def insert_sort_gap(li, gap): # gap是隻分的組數
for i in range(gap, len(li)): # i 表示摸到的牌的下标
temp = li[i]
j = i - gap # j 指的是手裡的牌的下标
while j >= 0 and li[j] > temp:
li[j+gap] = li[j] # 摸到的牌左邊的拍右移
j -= gap
li[j + gap] = temp
def shell_sort(li):
d = len(li) // 2
while d >= 1:
insert_sort_gap(li, d)
d //= 2
li = list(range(100))
import random
random.shuffle(li)
shell_sort(li)
print(li)
結果為:
希爾排序的時間複雜度與其選的gap有關!!!