假設有這樣一組數 ,如果我們以步長為 5開始進行排序:
13, 14, 94, 33, 82,
25, 59, 94, 65, 23,
45, 27, 73, 25, 39,
10
然後我們對每列進行排序(即小的數放前):
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
將上述四行數字,依序接在一起時我們得到:,然後再以 3 為步長:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
最後以 1 為步長進行排序(此時就是簡單的插入排序了)。
第一次分組步長(增量)=n/2
第二次步為第一次的步長/2
…直到步長等於1演算法結束
1. 不需要大量的輔助空間,和歸併排序一樣容易實現。
2. 時間複雜度: 平均情況:o(nlog2n) 根據步長序列的不同而不同、最壞情況o(nlog2n),最好情況o(n)
3. 空間複雜度: o(1)
4、穩定性: 不穩定
5、複雜度:較直接插入排序複雜
# -*-coding:utf-8 -*-
def shellsort(input_list):
length = len(input_list)
if length <= 1:
return input_list
sorted_list = input_list
gap = length // 2
while gap > 0:
for i in range(gap, length):
j = i - gap
temp = sorted_list[i]
while j >= 0 and temp < sorted_list[j]:
sorted_list[j+gap] = sorted_list[j]
j -= gap
sorted_list[j+gap] = temp
gap //= 2
return sorted_list
if __name__ == '__main__':
input_list = [50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
print('排序前:', input_list)
sorted_list = shellsort(input_list)
print('排序後:', sorted_list)
希爾排序 1
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序。該方法的基本思想是 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序 增量足夠小 時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基...
排序 希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...
排序 希爾排序
縮小增量排序 待排序列按關鍵字基本有序時,直接插入排序的效率很高 希爾排序思想 將整個待排記錄分割為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序,就可以完成整個排序工作 增量序列中的值沒有除1以外的公因子,且最後乙個增量必須等於1 子串行的構成不是逐...