基本思想
设a=[9, 8, 7, 6, 5, 4, 3, 2, 1],若要用直接插入排序,元素移动的次数很多,希尔排序是针对直接插入排序的改进。
1. 选择一个初始步长 d(一般取 n/2,自定义),将序列中相隔d的元素进行排序
2. 新步长 d = d / 2(步长d的选取有不同规定,有的是 d/2,有的是 d/2 的基础上只取奇数,偶数就+1),依然将序列中相隔d的元素进行排序,直到 d = 1,此时的排序已经是直接插入排序了。
示意图如下,初始步长为 n/2,后面的步长在 n/2 的基础上采用奇数:
Python实现
def shellSort(a):
# 希尔排序: 小->大
# 对d的选取各有规定,本文以d/2为例
n = len(a)
d = n / 2
while d > 0:
for i in xrange(d, n):
index = a[i]
j = i - d
while j >= 0 and a[j] > index:
a[j + d] = a[j]
j -= d
a[j + d] = index
d = d / 2
return a
效率
与步长的选取有关
O(n1+£),0<£<1
参考资料
http://blog.csdn.net/hguisu/article/details/7776068
http://www.cnblogs.com/xkfz007/archive/2012/07/01/2572017.html