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