一文清晰简单弄懂希尔排序,并且使用python实现

python 代码

def shellsort(A):
    LEN = len(A)
    gap = LEN // 2
    while gap>0:
        for i in range(gap,LEN):
            j = i
            while A[j] < A[j-gap]:
                A[j], A[j-gap] = A[j-gap],A[j]
                j -= gap
        gap = gap // 2
    return  A

if __name__ == '__main__':
    A = [2,3,4,6,8,1,9,5]
    print(shellsort(A))

分析:

  • 从其他博主那里盗来一张图,方便解释

在这里插入图片描述

  • 首先你要关注为什么 gap 从 LEN // 2 做为初始值,然后每次 gap 都会减小,这究竟是为什么?
  • 当 gap = LEN // 2 的时候,如果 LEN = 10, gap = 5,从上面的图可以清晰地看见,整个序列被分成了 5 组,你可以粗略地理解 gap 的值等于把整个序列分组的个数。第二次 gap 变成了 2,整个序列又被分成了两组。可为什么 gap 要从大变到小呢?
  • 因为 gap 越大,组数越多,当整个序列开始的时候,是很凌乱的,这个时候分的组数越多,整个组中的值的数量就越少,那么在同一个组的数据之间进行插入排序的难度就会越小,所以当我们 gap = 5 的时候序列进行插入排序的难度是最小的,因为每一个组内只有两个值进行排序。而后随着序列逐渐变得有序,我们就可以减小 gap 从而使每个组的成员个数变多,来进行插入排序,这样会更有效率。
  • gap 除了组数之外,还有第二个意义,那就是同一个组数据下标之间的差距,因此叫 gap。例如,上图中的第一个图,gap = 5, 1A 和 1B 之间下标差距为 5 (1A 的 下标=0,1B 的下标=5)
  • 那为什么 i 要从 gap 开始进行遍历呢?因为后面有个 j-gap, 所以如果 i 从小于 gap 的下标开始,那么就会引发错误;因为希尔排序是插入排序的一个特殊情况,与插入排序一样,希尔排序在每个分组内,永远只关心左边的数据,即 j 与 j-gap 的比较,因此从gap开始是没有问题的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值