希尔排序法
前言
在原始记录的键值大部分已经排好序的情况下,插入排序会非常有效,因为它不需要执行太多的操作,进行数据搬移。而希尔排序是D.L.Shell在1959年7月所发明的一种排序法,可以减少插入排序中数据搬移次数,以加速排序的进行。排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再逐渐减少间隔的距离。
一、希尔排序过程
1、首先将所有的数据分成n份,划分数值最好是质数,但是不一定是2,为了计算方便,此处选择为数字2。因此,开始的间隔设置为4,(8/2,即n=4),分割过程,如下图所示:
2、对得到的四个区块(63,45),(92,71),(27,58),(36,7)进行插入排序,得到排序后的四个新区块(45,63),(71,92),(27,58),(7,36),如下图所示:
3、接下就是进一步的缩小间隔8/2/2=2,如图所示:
4、得到区块(45,27,63,58),(71,7,92,36)再进行一次插入排序,得到区块(27,45,58,63),(7,36,71,92),如图所示:
5、再减小分割间隔,8/2/2/2=1的间隔进行划分,得到区块(27,7,45,36,58,71,63,92),对整个新区块进行一次插入排序,就得到了最终排序,希尔排序结束。
总的来说,希尔排序就是插入排序的一种优化,对数据搬运上的一种优化,实质上还是利用插入排序进行排序。
二、希尔排序代码实现
1.python代码实现
代码如下(示例):
def shell_sort(arr):
size = len(arr)
gap = size//2
while gap >0:
for i in range(gap,size):#i为扫描次数,gap为设置间距的位移量
temp = arr[i]#temp用来暂存数据
j=i-gap#以j来定义比较的元素
while j>= 0 and arr[j]>temp:
arr[j+gap]=arr[j]
j-=gap
arr[j+gap]=temp
gap//=2
return arr
#打印数据
def showdata(data):
for i in range(len(data)):
print('%3d'%data[i],end='')
data = [16,25,39,27,12,8,45,63]
print('原始数据为:')
showdata(data)
result =shell_sort(data)
print('\n排序后的数据:')
showdata(result)
2.实验结果
参考
参考书籍:
吴灿铭,胡昭民,《图解算法使用Python》第2版,清华大学出版社。