Python 希尔排序
希尔排序也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,希尔排序的核心思想是:先将数组分割成若干个子序列,分别进行直接插入排序,然后一次缩减增量再进行排序,直至增量为零,然后对全体进行一次直接插入排序。
增量也叫分组步长,
第一次为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
def insertion_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, ......
def shell_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])
----------希尔排序-----------
[180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104]
Process finished with exit code 0