希尔排序,含python代码和视频演示

转载自:https://procjx.github.io/2020/03/06/%E3%80%90%E7%AE%97%E6%B3%95%E3%80%91%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F-Shell-Sort/

算法介绍

希尔排序,用来解决插入排序的不足:每次只能将数据往后挪动一个位置,不能往后挪动到一个比较远的位置;用gap表示数据挪动的距离,在插入排序中,gap一直等于1,在最坏情况下,将第一个数挪动最后一个位置需要挪动 n-1 次,为方便理解,用“1位插入排序”表示“插入排序”。
希尔排序中先将gap设置为一个比较大的值,进行一次“gap位插入排序”,然后将gap变小,进行一次“gap位插入排序”,不断迭代,直到gap不大于0。
gap变化过程如下:首先将gap设置为 n//meta (meta通常为质数2),然后下次将gap设置为 gap//meta,不断重复直到gap不大于0。gap更多变化方法

视频演示

首推: https://www.youtube.com/watch?v=SHcPqUe2GZM

如果看不了可以看这个 https://www.bilibili.com/video/av64424835

python代码

#-*- coding: utf-8 -*-

def shell_sort(data):
    meta = 2
    n = len(data)
    gap = int(n//meta)
    while gap>0:
        for i in range(gap, n):
            cur_data = data[i]
            j = i-gap
            while j>=0 and cur_data<data[j]:
                data[j+gap] = data[j]
                j -= gap
            data[j+gap] = cur_data
        gap = int(gap//meta)
    return data

if __name__ == '__main__':
    data = [7, 8, 5, 2, 4, 6, 3]
    sorted_data = shell_sort(data.copy())
    print("排序前:", data)
    print("排序后:", sorted_data)

算法分析

最好情况下,数据刚好是升序,比较次数为 S=sum(n-gap) while gap>0 , S< n(n-1)/2 挪动次数为 0;

最坏情况下,数据刚好是降序,比较次数为 S=(2*n-(k+1)*gap)/2 while gap>0, k*gap < n < (k+1)*gap, 挪动次数为 S

希尔排序是插入排序的改进版本,效率比插入排序更高。
希尔排序是不稳定的排序算法,最小时间复杂度为:O(nlogn),最大时间复杂度为:O(n^2)

希尔排序空间复杂度:O(1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值