排序算法04-希尔排序 Python实现

希尔(shell)排序是从插入排序改进而来的

以将[9,8,7,6,5,4,3,2,1]从小到大排序为例

首先将步长设为列表长度的一半,将列表分组,得到

[9,5]一组,[8,4]一组,[7,3],[6,2],[1]

但只是这样分,实际上9和5并没有挨在一起,还在原来的位置

然后分别对每一组进行插入排序,但是中间隔着三个数,不能不管,所以每次移动的单位都是步长

将插入排序的时候,我们知道了第一个数可以不管,

而且由分组的规则,导致前(步长)个数分别是每组的第一个数,

所以从第(步长+1)个数开始排序,因为移动单位是步长,所以每组之间不会相互影响,可以同步进行

得到结果[5,4,3,2,9,8,7,6,1]

然后步长取原来的一半,再分组

[5,3,9,7,1],[4,2,8,6]

分别对每组进行插入排序

直到步长小于1时结束

a = [9, 78, 54, 91, 86, 53, 88, 66, 46, 15]

"""步长初始化为列表长度的一半"""
step = len(a)//2

"""当步长 < 1时,排序结束"""
while step >= 1:
    """从第step+1个数开始同时对每组进行插入排序"""
    for i in range(step+1, len(a)):
        temp = a[i]
        j = i-step
        while j >= 0 and a[j] > temp:
            a[j+step] = a[j]
            j = j-step
        a[j+step] = temp
    """步长取原来的一半"""
    step = step//2

print(a)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值