排序算法希尔排序(C语言)

希尔排序是对直接插入排序的优化,在学习之前,没有学过插入排序的童鞋们建议先学习插入排序:点击跳转到插入排序

我们发现,当被排序的对象越接近有序时,插入排序的效率越高,那我们是否有办法将数组变成接近有序后再用插入排序,此时希尔大佬就发现了这个排序算法,并命名为希尔排序

希尔排序是对插入排序的优化,基本思路是先选定一个整数作为增量,把待排序文件中的所有数据分组,以每个距离的等差数列为一组,对每一组进行排序,然后将增量缩小,继续分组排序,重复上述动作,直到增量缩小为1时,排序完正好有序。

希尔排序原理是每一对分组进行排序后,整个数据就会更接近有序,当增量缩小为1时,就是插入排序,但是现在的数组非常接近有序,移动的数据很少,所以效率非常高,所以希尔排序又叫缩小增量排序。

每次排序让数组接近有序的过程叫做预排序,最后一次插入是直接插入排序

每一次排序之后数组就会变得接近有序,插入排序的移动次数就会越来越少,效率也不是普通的插入排序能比的了

希尔排序移动次数:共移动8步

综上所述:希尔排序在越大的数组上更能发挥优势,因为步子迈的更大,减少插入排序的移动次数更多

最初希尔提出的增量是gap=n/2,每一次排序完让增量减少一半gap=gap/2,直到gap=1时排序变成了直接插入排序。直到后来Knuth提出的gap=[gap/3]+1,每次排序让增量成为原来的三分之一,加一是防止gap<=3时gap=gap/3=0的发生,导致希尔增量最后不为1,无法完成插入排序。到目前为止业内对于两个大佬的方法依然是看法不一,都没有比出个上下来

我们目前使用的则是Knuth提出的除三法获得希尔增量来演示

希尔排序的代码实现比较魔幻,由于我们讲解的希尔排序的思路是将分组进行直接插入排序,就导致我们容易产生疑惑,是不是分多少组就调用多少次插入排序的代码呢,那这代码量不就随着增量的变化而变化了,但是动态代码这个概念听着就让人倍感稀奇。所以我们仅用一次遍历数组的方式就巧妙对每个分组完成单趟排序,不需要对代码做那样鬼畜的操作

这个过程相当于对每个分组按照一个固定顺序轮流插入排序,并且它们是以一个元素为单位同时进行的,而不是先将某个分组插入排序完再下一个分组。

THE END
1.排序:希尔排序(算法)希尔算法的性能与所选取的增量(分组长度)序列有很大关系。只对特定的待排序记录序列,可以准确地估算比较次数和移动次数。想要弄清比较次数和记录移动次数与增量选择之间的关系,并给出完整的数学分析,至今仍然是数学难题。 希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行https://www.jianshu.com/p/d730ae586cf3
2.希尔密码加密算法及原理在古今中外的间谍战争中,敌人总是尽一切可能得到破解对方密码的钥匙,但要得到希尔密码的三把钥匙并不容易。 世界上没有无法突破的密码,希尔密码也不例外。希尔密码算法的缺点是线性变换的安全性非常脆弱,容易被攻击打破。黑客利用各种密码的弱点频繁攻击用户。尽管如此,希尔密码仍然是一个简单高效的密码。https://www.55tools.com/news/0376.html
3.排序算法图解之Java希尔排序java希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称缩小增量排序。本文通过图片和示例讲解了希尔排序的实现,需要的可以了解一下 + 目录 1.希尔排序简介 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种https://www.jb51.net/article/266793.htm
4.算法希尔排序算法的讲解和代码实践十大排序算法【算法】希尔排序算法的讲解和代码实践 思路 希尔排序,与其他排序不同的是,别的排序都能通过名字关联上,而希尔排序的名字,怎么看也不太像中文。 其实希尔排序就是插入排序的进化版,它会先声明一个间隙参数,然后按照间隙参数,把数组分成若干各子数组,对子数组进行插入排序。随着间隙越缩越小,整个数组的顺序也就慢慢https://download.csdn.net/blog/column/11823486/125115339
5.排序算法希尔排序详解!(源码+实现)腾讯云开发者社区希尔排序(Shell Sort)是一种排序算法,由美国计算机科学家Donald Shell于1959年提出。希尔排序是插入排序的一种改进版本,旨在减少插入排序的交换操作和比较次数,从而提高排序效率。这个算法的名字是以发明者的名字命名的,虽然它也被称为“递减增量排序”。 https://cloud.tencent.com/developer/article/2381976
6.排序算法之希尔归并堆和基数排序//希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的 : 1. 插入排序在对几乎已经排好序的数据操作时,效率…https://zhuanlan.zhihu.com/p/88592144
7.希尔排序算法·PHP知识总结·看云希尔排序(Shell's Sort)是直接插入排序算法的一种更高效的改进版本,又称“缩小增量排序”(Diminishing Increment Sort)。 希尔排序是将要排序的数组按下标的一定增量进行分组,每组分别进行直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个数组都被分成一组,算法结束。 https://www.kancloud.cn/chenguanxu/test/2532630
8.美团架构师呕心之作:大厂面试核心知识点梳理5. 希尔排序算法 6. 归并排序算法 7.桶排序算法 8. 基数排序算法 9. 回溯算法 10. 最短路径算法 11. 最大子数组算法 12. 最长公共子序算法 13. 最小生成树算法 21. 数据结构 1栈(stack) 2 队列(queue) 3 链表(Link) 4 散列表(Hash Table) https://maimai.cn/article/detail?fid=1376287358&efid=W5_jYkpsH_eRLg3yD3tFwg
9.十大排序算法之冒泡排序快速排序的介绍首先,整个希尔排序就分为两个步骤:先进行预排序,然后进行插入排序。 我们知道,插入排序算法中如果序列本身已经很接近有序了,那么插入排序是一个不算的算法,那如果序列本身离着有序还很远,此时如果再用插入排序算法的话,效率就会非常低。所以这就引出了希尔排序(对插入排序进行优化)。 https://open.alipay.com/portal/forum/post/129601176
10.排序算法——希尔排序的图解代码实现以及时间复杂度分析希尔排序是冲破二次时间屏障的第一批算法之一。 希尔排序通过比较相距一定间隔的元素来工作;各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,希尔排序有时也叫做缩减增量排序。 希尔排序使用一个序列h1,h2,…,hi,这个序列叫做增量序列(increment sequence)。增量序列只要求h1https://www.cnblogs.com/zhangyiqinga/p/9777207.html
11.排序算法(八)希尔排序(缩小增量排序)51CTO博客次数会进一步减少。希尔排序就是基于这样一种思路来设计的排序算法。 2、希尔排序(Shell Sort,又称缩小增量法)是一种分组插入排序方法,因DL.Shell于1959年提出而得名,实质上是一 种分组插入方法。 3、排序思想 (1)先取一个正整数d1(d1<n)作为第一个增量,将全部n个记录分成d1组,把所有相隔d1的记录放在一https://blog.51cto.com/u_7174271/6725358