排序算法之希尔排序法

希尔排序法



前言

在原始记录的键值大部分已经排好序的情况下,插入排序会非常有效,因为它不需要执行太多的操作,进行数据搬移。而希尔排序是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版,清华大学出版社。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值