raptor五个数排序流程图_算法篇----希尔排序

在之前的文章里,我们讲解了插入排序,而希尔排序相当于对插入排序的一种优化。在这里我们简单回顾下插入排序,插入排序的核心思想是,从数组首位开始,通过遍历,将相邻的两个元素进行排列,小的元素放在前面,大的元素放在后面,并使用递归,将调换位置的元素继续与前面的元素进行比较,一直到前i个元素有序为止。然后重复上述步骤,一直到数组末尾。示意图如下:

07ecf4bcb4b8c27e2088d307fb293a48.png

我们可以知道,插入排序对于基本有序,或者数组规模较小的数组它的效率还是很高的,但是这里就有一个问题,现在给出的只是五个数,如果数字数量不断增多,并且还是无序甚至是倒叙时,那么插入排序就需要耗费非常多的时间,来不断进行数组中元素的移动。由此,我们引出希尔排序。

希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的处理性能表现还不错。它的实现思路是:先把较大的数据集合按(增量)分割成若干个小组(逻辑上的分组),然后对每一个小组分别进行插入排序,这样插入排序所作用的数据量就会减少很多,插入的效率就会提高。然后减少增量继续分组,这样可以将每个组的范围扩大一些,这样就做到了有序组跟有序组进行插入排序形成有序数组的操作,继续减少增量继续插入排序,一直到增量为1时,这时候相当于对整个数组进行插入排序,这时候的数组,已经做到了基本有序,小的元素在前面,大的元素在后面,这样插入排序的效率就会提升非常多。

如图,对数组元素进行逻辑上的分组,它们在数组中的位置还是原来的样子,并没有进行分组操作,只是将它们看成这几个分组。

51349291f062def7b89fe216e79fb034.png

可以看出它们是按照下标相隔距离(增量)为4分的组。这时候,每个分组进行插入排序,各个分组就变成了了有序的了,但是整体却还不一定有序,这时候从整体看,小的元素大体在前面,大的元素大体在后面。

5d34dbf7d8d9a1bcf8334385103c6134.png

然后我们缩小增量为上个增量的一半:2,继续进行分组操作,这时候每个分组元素多了,但是数组变的部分有序,插入效率就会很高。

08d5cb81ee96ec4431b1ae20d5445e16.png

然后执行插入排序,使其每个分组各自有序

7d86f90b8b756e689d4bf2362fcbeeef.png

然后设置增量为之前的一半:1,则整个数组被分成一组,但此时整个数组已接近有序,插入效率会很高。

9f6af5ef1f5f4a1113f74c0c57184e90.png

代码实现:

2c4f8461ddc86dcfb276f94726f2bdf9.png

以上就是希尔排序的基本思想及其代码实现,希尔排序中对于增量序列的选择是非常重要的,这直接影响到希尔排序的性能。我们选择的增量序列{n/2,(n/2)/2,....,1}最坏时间复杂度依然为O(n^2)。 Hibbard提出了另一个增量序列{1,3,7,...,2^k-1},这种序列的时间复杂度(最坏情形)为O(n^1.5)

Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109,...}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值