- 理論
每隔一個gap取一個值構成一個子序列,比如一個含9個值的序列,gap=4,這就獲得了四個序列(i1, i5, i9), (i2, i6), (i3, i7), (i4, i8),這種分子序列是在邏輯上進行的,並不改變原序列的結構
在每個子序列內進行插入排序
排序完一輪後將gap減半,再次進行按gap分子序列插入排序
gap選取是一個值的研究的地方
-
實現
在描述原理時把整個序列分成若干子序列,每個子序列進行插入排序。
在實現的時候,爲了實現方便,採用一種每個子序列批量插入排序的方式(有些串行的感覺),而不是一個子序列排序完成後再排序下一個子序列,大概是這樣的,操作完第一個序列中的第二個元素,再操作第2個序列的第2個元素,再第3個的第2個元素,,,
def shellsort(alist): n = len(alist) gap = n//2 # 5/2=2.5 5//2=2 取整 while gap >= 1: # 這樣同時執行幾個子序列排序的方式就比較好寫,可以直接寫成rang(gap,n) # 內部就跟插入排序是一樣的 for i in range(gap, n): j = i while j>0: if alist[j]<alist[j-gap]: alist[j], alist[j-gap] = alist[j-gap], alist[j] j -= gap else: break # 縮短gap gap //= 2
-
測試
if __name__ == '__main__': ll = [3,6,2,4,7,5,8,1,0,9] print(ll) shellsort(ll) print(ll)
-
時間複雜度
- 最優時間複雜度:根據步長序列的不同而不同
- 最壞時間複雜度:O(n^2)
- 穩定性:不穩定