Python3实现希尔排序

原理思路

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序的实质就是分组插入排序。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
思想的理解可以参考维基百科的这篇文章希尔排序和这篇通俗易懂、层层递进优化的文章白话经典算法系列之三 希尔排序的实现,本文主要是基于后一篇文章的思想进行了python语言的实现。
步骤归纳:

  1. 选择一个步长序列tk,…,1。
  2. 按照步长序列个数k,对排序序列进行k趟排序,
  3. 每趟排序,根据对应的步长ti,将待排序序列分割成ti个子序列,分别对各个子序列进行直接插入排序

代码实现

普通版本

对直观的理解希尔排序有帮助,但不够简洁清晰,可以在去掉一层循环

def hell_sort(collection):
    length = len(collection)
    gap = length // 2
    while gap > 0:
        for i in range(0, gap):
            j = i + gap
            while j < length:
                k = j - gap
                temp = collection[j]
                while k >= 0 and collection[k] > temp:
                    collection[k + gap] = collection[k]
                    k -= gap
                collection[k + gap] = temp
                j += gap
        gap //= 2
    return collection

if __name__ == '__main__':
    collection = list(map(int, input().split()))
    print('排序前:', end='')
    for i in collection:
        print(i, end=' ')
    collection = hell_sort(collection)
    print('\n排序后:', end='')
    for i in collection:
        print(i, end=' ')

优化后的版本

def hell_sort_optimization(collection):
    length = len(collection)
    gap = length // 2
    while gap > 0:
        j = gap
        while j < length:
            k = j - gap
            temp = collection[j]
            while k >= 0 and collection[k] > temp:
                collection[k + gap] = collection[k]
                k -= gap
            collection[k + gap] = temp
            j += 1
        gap //= 2
    return collection

if __name__ == '__main__':
    collection = list(map(int, input().split()))
    print('排序前:', end='')
    for i in collection:
        print(i, end=' ')
    collection = hell_sort_optimization(collection)
    print('\n排序后:', end='')
    for i in collection:
        print(i, end=' ')

小结

希尔排序的关键在于步长的设定,这方面的文章可以参考前面提到的那篇维基百科的文章。
希尔排序最坏时间复杂度还跟步长序列有关,平均时间复杂度是O(nlogn),空间复杂度为O(1)

项目地址

后续实现的一些算法我都会统一放到GitHub,欢迎小伙伴们一起交流、学习,一起进步!下面是我的GitHub网址。
Github Data_Structure_and_Algorithm

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!
每日学一技

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值