希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
上面的这段叙述来自百度百科,我们可以知道希尔排序是插入排序的改进版,如果插入排序还没有搞清楚的话,建议先去看这篇博客补一补:都是❤️两层循环❤️的冒泡排序,选择排序,插入排序该怎么区分。这里我们也大致在对插入排序做个复习。
插入排序将第一个数(也可以识别的)看为有序区间开展,从第二个数开始依次拿着每个数去到有序区间依次比较,最终插入到合适他的地方。
希尔排序做了升级,遵循下面这个循环:
- 按照一个规则将待排序序列分组(分组规则有很多,我们这里介绍一种:开始将序列分成序列长度除以二组,比如一共十个数,除以二等于五,就先分成5组,两个为一组,然后每次循环都会重新除以二分组,第二次就是 5 / 2向下取整为2组,第三次是一组)
- 然后对同一组做组内插入排序,我们做升序
- 组数除以二,现在就是2组,就是五个为一组
- 回到2循环
一直到所有数为同一组,再做最后一次排序。最后一次就是我们理解的对整个序列插入排序,这次排序竣事序列也就有序了,下面看一下动图演示:
可以清楚地看到最后一次就是我们原来学的插入排序,那么有些人就有疑问了,为什么要大费周章的先从分组做插入排序开始?因为这样做会让每个数字更快的接近他排好序的位置,从而节省了时间,可以直白的理解为这么做就是更快了。。。
下面是代码实现:
[code] public static void insertSort(int[] array, int size){ for (int i = size; i </span arrayspan class="token punctuation"./spanlengthspan class="token punctuation";/span ispan class="token operator"++/spanspan class="token punctuation")/spanspan class="token punctuation"{/span span class="token keyword"int/span jspan class="token punctuation";/span span class="token keyword"int/span val span class="token operator"=/span arrayspan class="token punctuation"[/spanispan class="token punctuation"]/spanspan class="token punctuation";/span span class="token keyword"for/span span class="token punctuation"(/spanj span class="token operator"=/span i span class="token operator"-/span sizespan class="token punctuation";/span j span class="token operator">= 0 && val <span class="token operator"> |
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。