Python 希爾排序

2021-08-20 11:42:32 字數 3267 閱讀 6982

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

增量也叫分組步長,

第一次為len(array) / 2

第二次為(len(array)/2) / 2

直到增量為1

index 和 index+step所指向的值做比較,如果index指向的值比index+step指向的值大,那麼就交換位置。

實現**如下:

# -*- coding: utf-8 -*-

# @time : 2018/6/4 16:31

# @author : li

# @file : shell_sort.py

import random

definsertion_sort

(array):

for index in range(1, len(array)):

# 記錄當前元素值

current_value = array[index]

position = index

# 只有在當前位置大於0,而且當前位置左邊元素大於當前位置元素的時候

# 才需要將當前位置左邊的乙個元素往右移動一位,並且當前位置往左移動一位

while position > 0

and array[position-1] > current_value:

array[position] = array[position-1]

position -= 1

# 直到直到一位元素不比current_value小,或者已經將左邊所有元素比較完。

# 記住左邊永遠是已經排好順序的

# 當將當前位置左邊所有的元素都排好順序之後,將current_value的值賦給當前位置元素

array[position] = current_value

print("insertion sort:", array)

return array

# 希爾排序分組步長的取法是 len/2, (len/2)/2, ......

defshell_sort

(array):

step = int(len(array)/2)

while step > 0:

for index in range(0, len(array)):

if index + step < len(array):

current_value = array[index]

if current_value > array[index+step]:

array[index], array[index + step] = array[index + step], array[index]

print("shell sort :", array)

step = int(step/2)

return insertion_sort(array)

if __name__=="__main__":

array = [random.randrange(10000+i) for i in range(10)]

print("source array", array)

sort = shell_sort(array)

print

"----------希爾排序-----------"

print(sort)

輸出結果為:

c

:\python27\python.exe d

:/lzhroot/myclasspro/python/test/python_algorithm/shell_sort.py

('source array', [180, 2791, 1832, 1910, 6656, 2345, 2830, 5676, 7104, 5102])

('shell sort :', [180, 2791, 1832, 1910, 5102, 2345, 2830, 5676, 7104, 6656])

('shell sort :', [180, 1910, 1832, 2345, 2830, 2791, 5102, 5676, 7104, 6656])

('shell sort :', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])

----------希爾排序-----------

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 希爾排序

希爾排序的基本思想是 將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好的理解這演算法,演算法本身還是使用陣列進行排序。例如,假設有這樣一組數 13,14,94,33,82,25,59,94,65,23,45,27,73,...

python 希爾排序

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