希尔排序(Python实现)

# python实现希尔排序(插入排序的一种)
# 先宏观进行调整,在进行微观调整

def shellSort(lst, k, reverse=False):
    length = len(lst)
    dk = k # 设置一个增量dk
    while dk > 0:
        for i in range(dk, length):
            temp = lst[i]
            j = i
            while j >= dk and lst[j - dk] > temp:
                lst[j] = lst[j - dk]
                j -= dk
            lst[j] = temp
        dk = int(dk / 2)
    if reverse == False:
        return lst
    else:
        lst.reverse()
        return lst

# 测试数据
test1 = [19, 21, 4, 6, 25, 3, 99, 67, 12]
test2 = [19, 21, 4, 6, 25, 3, 99, 67, 12]
data1 = shellSort(test1, 7)
data2 = shellSort(test2, 2, True)
print("从小到大:", data1)
print("从大到小:", data2)

 

 

希尔排序基本思想: 先进行宏观调整,后微观调整。

【 10  9  8  7  6  5  4  3  2  1 】

1.增量为 5 时:                                                                       分别进行插入排序的结果:

①【10  5 】                                                                                            【 5 10】 

②【 9   4 】                                                                                            【 4  9 】 

③【 8   3 】                                                                                            【 3  8 】 

④【 7   2 】                                                                                            【 2  7 】 

⑤【 6   1 】                                                                                            【 1  6 】 

 此时data [ ] 为:【 5 4 3 2 1 10 9 8 7 6 】

2.增量为 4 时:                                                                        分别进行插入排序的结果:

①【 5 1 7 】                                                                                           【 1   5  7 】

②【 4 10  6 】                                                                                        【 4   6  10 】

③【 3  9 】                                                                                             【 3   9 】

④【 2  8 】                                                                                             【 2   8 】

此时data [ ] 为:【 1 4 3 2 5 6 9 8 7 10 】

以此递推到增量为 1 。

敬请赐教!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值