排序(1) 希爾排序(Shell s Sort)

2021-09-25 08:21:04 字數 1445 閱讀 9866

假設有這樣一組數 ,如果我們以步長為 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 子串行的構成不是逐...