2024年最新【Python排序算法系列】—— 希尔排序_python希尔排序(2),2024年最新腾讯面试做题

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

希尔排序 (ShellSort)

由来和特点

理解

过程演示

Step1:

Step2:

Step3:

实现代码:

Self Check

📝总结:


希尔排序 (ShellSort)

由来和特点

希尔排序是一种高效的排序算法,由美国计算机科学家Donald Shell于1959年提出。希尔排序基于插入排序算法,通过比较相距一定间隔的元素来把元素移动到最终位置,从而实现排序。

希尔排序的基本思想是将待排序的数组按照一定的间隔分成若干个子序列,对子序列进行插入排序,然后缩小间隔,重复进行插入排序,直到间隔为1,最后通过插入排序将整个序列排序完成。

希尔排序的特点:

1. 缩小增量**:**希尔排序的一大特点是将数组分成若干个子序列进行排序,通过缩小增量的方式减少了插入排序的次数。增量的选择有多种方法,常用的是二分法,即每次将增量除以2,直到增量变为1为止。

2. 分组插入排序**:**希尔排序将数组按照一定的间隔分成若干个子序列,对每个子序列进行插入排序。由于子序列的长度较短,插入排序的时间复杂度较低,从而提高了排序的效率。

3. 大幅度减少逆序对**:**由于希尔排序是通过间隔分组进行插入排序的,每次排序都会将相距较远的元素进行比较和交换,从而大幅度减少了逆序对的数量。逆序对的数量是衡量一个排序算法效率的指标,逆序对越少,排序效率越高。

4. 非稳定性**:**希尔排序是一种非稳定的排序算法。在排序过程中,相同大小的元素可能会发生交换,导致原来相对顺序的改变。

总结起来,希尔排序是一种高效的排序算法,通过缩小增量和分组插入排序的方式,大幅度减少了逆序对的数量,从而提高了排序效率。虽然希尔排序存在一定的非稳定性,但在实际应用中并不影响排序结果的正确性。希尔排序在大多数情况下都能够比较好地工作,并且****适用于各种规模的数据集。

理解

希尔排序是插入排序的优化,他把整个列表按照定义的gap(为步长【也叫增量】)切割【隔着gap切割而非连续切割】成多个子列表,然后对子列表进行排序,排完序以后的整个列表,若还是存在无序,我们可以将增量递减,继续进行插入排序,直到增量为1,当增量为1的时候整个列表直接进行插入排序,此时,已经在前面排好的基础上进一步进行插排,因此希尔排序在最后进行插排的时候比整个无序表进行插排的速度快很多。

子列表的个数 = 步长

过程演示

Step1:

希尔排序第一步:这里我们选择二分法, 按照步长 gap = len (alist) / /  2 进行列表的切割。

原来的无序表的长度是9,所以它的步长gap = 9 / / 2 = 4,如上图切割成4个子列表。

【注意】****:实际上他不会像图上一样分开成四个,而是按照原来的进行切分,只是为了更好的理解,我们才分开画的。


Step2:

第二轮,继续按照步长 gap = len (alist) / /  2 进行列表的切割。

原来的无序表个数是4,所以它的步长gap = 4 / / 2 = 2,如下图切割成2个子列表。


Step3:

第三轮,继续按照步长 gap = len (alist) / /  2 进行列表的切割。

原来的无序表的个数是2,所以它的步长gap = 2 / / 2 = 1,如下图切割成1个子列表。


实现代码:

#切割列表,然后利用for循环进行插排
def shell_sort(alist):
    sublistcount = len(alist) // 2 #切割子列表的步长
    while sublistcount > 0:  #只要还可以切割



**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
![img](https://img-blog.csdnimg.cn/img_convert/b6cc5331271c08b0d7c9eae3a1bebdaf.png)
![img](https://img-blog.csdnimg.cn/img_convert/5c28c4e02ebbc0dcd72e1a36bff8e500.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**

伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值