Python 希爾排序

2021-08-22 06:16:46 字數 1361 閱讀 2940

希爾排序的基本思想是:將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好的理解這演算法,演算法本身還是使用陣列進行排序。

例如,假設有這樣一組數[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10],如果我們以步長為5開始進行排序,我們可以通過將這列表放在有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

將上述四行數字,依序接在一起時我們得到:[10, 14, 73, 25, 23, 13, 27, 94, 33, 39, 25, 59, 94, 65, 82, 45]。這時10已經移至正確位置了,然後再以3為步長進行排序:

10 14 73

25 23 13

27 94 33

39 25 59

94 65 82

45

排序之後變為:

10 14 13

25 23 33

27 25 59

39 65 73

45 94 82

94

最後以1步長進行排序(此時就是簡單的插入排序了)

def shell_sort(alist):

n = len(alist)

# 初始步長

gap = n // 2

while gap > 0:

# 按步長進行插入排序

for i in range(gap, n):

j = i

# 插入排序

while j >= gap and alist[j - gap] > alist[j]:

alist[j - gap], alist[j] = alist[j], alist[j - gap]

j -= gap

# 得到新的步長

gap = gap // 2

alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]

shell_sort(alist)

print(alist)

最優:根據步長序列的不同而不同

最壞:o(n**2)

穩定性:不穩定

Python 希爾排序

coding utf 8 希爾排序 def shellsort list list 4,1,9,13,34,26,10,7,4,3 m len list 元素數目 gap m 2 gap 5,2,1.while gap 0 print gap 列表中的list i 按間隔gap從列表中取元素list...

Python 希爾排序

希爾排序也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本,希爾排序的核心思想是 先將陣列分割成若干個子串行,分別進行直接插入排序,然後一次縮減增量再進行排序,直至增量為零,然後對全體進行一次直接插入排序。增量也叫分組步長,第一次為len array 2 第二次為 len array 2 ...

python 希爾排序

希爾排序,將相聚某個 增量 的記錄組成乙個子串行,這樣才能能保證在子串行內分別進行直接插入排序後得到 的結果是基本有序而不是區域性有序 def shellsort list increment len list len list 2 1 增量的選取有待進一步研究 增量序列的最後乙個增量必須是1 wh...