排序算法---希尔排序

希尔排序是对插入排序的改进,是递减增量排序算法。

基本思想

  • 将整个待排序的记录序列分割为若干子序列分别进行直接插入排序
  • 其中的子序列不是逐段分割的,而是相隔特定的增量的子序列。
  • 选择更小的增量,将数组分割成多个子序列进行排序
  • 最后,选择增量为1,对全体记录进行直接插入排序。

增量选择

在每一趟的排序过程中,都有一个增量,至少满足一个规则:

          增量关系:d[1]>d[2]>d[3]……>d[t]=1(t趟排序)

建议采用:首选增量为n/2,每次增量为原先的1/2,直到增量为1.

算法实例

 

性能分析

  • 平均时间复杂度:o(N^1.3),大量数据研究表明在o(N^1.3)附近,事实上也不是严格论证的结果
  • 最好时间复杂度:仍然和增量序列的选取有关
  • 最坏时间复杂度:o(N^2)
  • 空间复杂度:o(1)
  • 稳定性:不稳定,例如待排序列(3,2,2,1),取时,显然就能看出是不稳定的

python代码

    def shellsort(self,nums:list):
        length = len(nums)
        step = int(length/2)
        while step > 0: #
            for j in range(0,length):
                if j + step < length:
                    if nums[j] > nums[j + step]:
                        nums[j], nums[j + step] = nums[j + step],nums[j]
            step = int(step/2)
        for i in range(1,length):
            key = nums[i]
            j = i - 1
            while j >= 0 and nums[j] > key:
                nums[j + 1] = nums[j]
                j = j - 1
            nums[j + 1] = key
        return nums

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值