图解排序算法(二)之希尔排序

希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。

我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap=gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

在希尔排序的理解时,我们倾向于对于每一个分组,逐组进行处理,但在代码实现中,我们可以不用这么按部就班地处理完一组再调转回来处理下一组(这样还得加个for循环去处理分组)比如[5,4,3,2,1,0],首次增量设gap=length/2=3,则为3组[5,2][4,1][3,0],实现时不用循环按组处理,我们可以从第gap个元素开始,逐个跨组处理。同时,在插入数据时,可以采用元素交换法寻找最终位置,也可以采用数组元素移动法寻觅。希尔排序的代码比较简单,如下:

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