排序算法图解(四):希尔排序
文章目录
- 1 希尔排序简介
- 2 希尔排序算法图解
- 3 希尔排序代码实现
- 写在最后
1 希尔排序简介
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称缩小增量排序。
希尔排序是非稳定排序算法。把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
2 希尔排序算法图解
以序列: {8, 9, 1, 7, 2, 3, 5, 6, 4, 0}
为例!
- 初始步长gap = length/2 = 5,意味着将整个数组分为了5组,即[8,3],[9,5],[1,6],[7,4],[2,0],对每组进行插入排序,得到序列:
{3,5,1,4,0,8,9,6,7,2}
,可以看到:3,5,4,0这些小元素都被提到前面了。
- 缩小增量gap = 5/2 = 2,数组被分为两组,即[3,1,0,9,7],[5,4,8,6,2],对这两组分别进行直接插入排序,可以看到,整个数组的有序程度更进一步了。
- 再次缩小增量,gap = 2/2 = 1,此时整个数组为[0,2,1,4,3,5,7,6,9,8],进行一次插入排序,即可实现数组的有序化(仅需要简单微调,而无需大量移动操作)。
3 希尔排序代码实现
import java.util.Arrays;/*** @author 兴趣使然黄小黄* @version 1.0* 希尔排序*/
public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 6, 4, 0};System.out.println("排序前: " + Arrays.toString(arr));shellSort(arr);System.out.println("排序后: " + Arrays.toString(arr));}//希尔排序public static void shellSort(int[] arr){//设定步长for (int gap = arr.length / 2; gap > 0; gap /= 2){//将数据分为arr.length/gap组,逐个对其所在的组进行插入排序for (int i = gap; i < arr.length; i++) {//遍历各组中的所有元素,步长为gapint j = i;int temp = arr[j]; //记录待插入的值while (j - gap >= 0 && temp < arr[j-gap]){//移动arr[j] = arr[j-gap];j -= gap;}//找到位置,进行插入arr[j] = temp;}System.out.println(Arrays.toString(arr));}}
}
实现结果如下:
写在最后
本文被 Java数据结构 收录点击订阅专栏 , 持续更新中。
创作不易,如果你有任何问题,欢迎私信,感谢您的支持!
排序算法图解(四):希尔排序相关推荐
- js排序算法详解-希尔排序
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...
- 希尔排序是一种稳定的排序算法_全面解析十大排序算法之四:希尔排序
点击上方蓝字关注我们吧 1. 十种排序算法的复杂度和稳定性 时间复杂度:一个算法消耗所需要的时间 空间复杂度:运行一个算法所需要的内存时间 稳定性:如一个排列数组:1.4.5.6.4.7. 此时有一对 ...
- 算法-22-字符串的排序算法(四种排序)
目录 1.字符串 1.1.属性 1.2.字母表 2.字符串排序方法 3.键索引计数法 3.1.第一步:频率统计 3.2.第二步:将频率转换为索引 3.3.第三步:数据分类排序 3.4.第四步:回写排序 ...
- 排序算法研究之希尔排序(shell sort)
前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序本节,我们介绍插入排序的改进版的希尔排序. 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接 ...
- python实现希尔排序算法_python实现希尔排序算法
希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...
- python算法与数据结构-希尔排序算法(35)
阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...
- [ 数据结构 -- 手撕排序算法第四篇 ] 选择排序
手撕排序算法系列之第四篇:选择排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算 ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序
第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...
最新文章
- windows 80端口被占用的解决方法
- 如何忽略Git中目录中的文件?
- oracle查看列数据类型
- 笔记本显示器仅计算机,将笔记本电脑(仅一个HDMI接口)连接到双屏幕(谨慎使用)的解决方案...
- JavaScript内存泄漏知多少?
- 在mysql-workbench中运行set和declare并且观察区别
- 求一份100行左右的C语言程序,求4个C语言程序 每个100行左右 大一水平的
- 分布式消息中间件之kafka设计思想及基本介绍(一)
- 自学Android到什么程度才能找到工作?
- 手机签名工具_iOS越狱神器复活!自签工具 ReProvision 又可以愉快使用了
- android强制开启深色模式bug,强制深色模式软件
- 嵌入式arm(一)学ARM要掌握的预备知识(本篇文章持续更新)
- 摄像头相关控制器集合
- 苹果手机怎么验证app_【图文】苹果手机如何下载安装APP
- 移动 webApp 开发入门与进阶
- Pokémon Army (easyversion) -每天一把CF - 20201007
- Exchange 常见问题之十
- origin中文版散点图拟合曲线_origin中两组数已经画出散点图,如何新增类似于excel中的趋势线?而且是幂函式的,求高手指点...
- oracle in函数的使用,oracle in 函数
- 阿里云服务器优势和特点
热门文章
- 图解原型链及其继承优缺点
- 【整车Silmulink模型】(三)驾驶员模型方向盘转角控制
- CHJ_MarkDown
- 吴军:厉害的人是这样为人处世的
- java8安装包打不开_Win7系统下安装JDK提示“无法打开此安装包请确认该程序包存在”怎么办?...
- Oracle数据库安装容易出错问题的解决方案
- 大企业邮箱品牌排行中,哪个企业邮箱好用?
- 复用浏览器之跳过扫码登录
- 211硕士 进大厂美团亲身经验分享-面试不算难(学累了进来看看)
- Digitalize Your Supply Chain 数字化供应链解析