数据结构及算法

希尔排序听起来有点难,其实很简单

2021-04-13  本文已影响0人  Code综艺圈

前言

直接插入排序当待排序数据的顺序和期望排序结果相反时,排序效率是最差的;上次聊到的折半插入排序只是减少有序列表的比较次数,而对于整体数据遍历次数还是没有得到优化;接下来要说的希尔排序就是针对整体数据进行优化,从而提升排序效率。

正文

1.1 希尔排序算法思想

希尔排序(Shell's Sort)是直接插入排序算法的改进版,又称“缩小增量排序”(Diminishing Increment Sort);

算法思想

将待排序数据根据指定步长进行分组,分别进行直接插入排序;减小步长,重复分组,重复直接插入排序,直到步长为1时进行最后一次插入排序。

对于第一次步长可以根据需要自定义,但一般推荐会设置为元素个数除以2(lenght/2),后续的步长依次是上一次步长除以2(stepk=stepk-1/2),直到步长为1,如下图:

image-20210407235130599

上面说到步长可以理解为增量,而减少步长的过程,也就是缩小增量,即希尔排序又称为缩小增量排序。

分组原理(第一次分组的step1=6/2=3):

接下来的分组就依次递减步长,即上一次步长除以2取整; 然后根据新算出来的步长继续将上一次的排序的结果分组即可;直到步长递减到为1时,整体进行最后一次直接插入排序为止;

1.2 希尔排序算法实现与解析

代码实现(升序):

代码

运行结果如下:

结果

步骤解析:

步骤

上图步骤说明:

第一次分组排序完成之后,调整步长,继续进行分组,由于第二次计算出的步长step2=step1/2=1,即将所有上一次分组的数据全部为一组进行最后一次直接插入排序即可;这里就不在重复演示了,具体步骤和之前说到的直接插入排序一样,参照这篇大牛领导单独找我聊了两句:搞框架的同时别忘了算法

通过第二次插入排序完成之后就得到最后的排序结果啦。

1.3 希尔排序算法分析

时间复杂度

时间复杂度最坏情况和直接插入排序的时间复杂一样,都是O(n2),但有其他大神经过大量演示,希尔排序的时间复杂度一般为O(n(1.3~2)),比O(n2)性能好。

空间复杂度 在算法核心部分只采用了固定的几个中间变量((i,j,step,arrayb[0])),所以算法过程中消耗的内存是一个常量,则空间复杂度为O(1)

稳定性 由于在排序过程中是根据步长将原始数据进行分组,这样就可能会导致相同的元素分到不同组,在最终排序时就不能保证原来两个相同元素的顺序啦,所以希尔排序是不稳定的

综上所述,希尔排序的时间复杂度为O(n2),空间复杂度为O(1),是不稳定算法;

总结

到这里,插入排序的三种排序介绍完毕,下期开始介绍交换排序;这里先总结一下插入排序的相关关键点(下图绿色部分);如下:

总结

感谢小伙伴的:点赞收藏评论,下期继续~~~

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

上一篇下一篇

猜你喜欢

热点阅读