Python 实现 希尔排序, 希尔排序其实 就是 插入排序的改进版吧,希尔排序的步长选择都是从d=len/2开始,每次再减半,直到最后为1,当变为1的时候 ,可以认为就是简单的插入排序。这种缩小步长的好处,非常简单,弥补了插入排序的缺点,尽可能减少数字的移动次数。希尔思想是这样 局部看起来有序,然后局部的局部在有序,直到 步长为1,就保证了不会出现,待排序列都是逆序的情况。 这种想法非常高明,佩服希尔。
希尔排序按其设计者 希尔(Donald Shell)的名字命名,该算法由1959年公布。一些老版本教科书和参考手册把该算法命名为Shell-Metzner,即包含Marlene Metzner Norton的名字,但是根据Metzner本人的说法,“我没有为这种算法做任何事,我的名字不应该出现在算法的名字中。”
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
# coding=utf-8
'''
@author:chang
shell_sort 排序
2017-10-18 星期三
'''
def group_sort(array,length,d ,x):
'''
*group 内排序
*参数说明:
*array - - 待排序的数组
*len - - 数组的长度
*d 组的步长
*x 组的起始位置
'''
for i in range(x+d,length,d):
k = i
temp = array[k]
for j in range(i-d,-1,-d):
if array[j] > temp:
array[j+d]=array[j]
k =j
else:
break
array[k] =temp
def shell_sort(array,length):
gap = length//2
while gap >0:
for i in range(0,gap,1):
# 共gap个组,对每一组都执行直接插入排序
group_sort(array,length,gap,i)
gap = gap//2
return array
if __name__ == '__main__':
mylist=[1,34,6,21,98,31,7,4,36,16,47,67,37,25,2]
length= len(mylist)
print(shell_sort(mylist,length))
下面看看 结果:
总结: 本文主要实现用Python 实现希尔排序。
参考链接:
分享快乐,留住感动。 2017年 10月 18日 星期三 16:28:34 ---biaoge