文章目录

  • 1 希尔排序简介
  • 2 希尔排序算法图解
  • 3 希尔排序代码实现
  • 写在最后

1 希尔排序简介

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序,即将简单的插入排序进行改进后的一个更加高效的版本,也称缩小增量排序。

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


2 希尔排序算法图解

以序列: {8, 9, 1, 7, 2, 3, 5, 6, 4, 0} 为例!

  1. 初始步长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这些小元素都被提到前面了。
  2. 缩小增量gap = 5/2 = 2,数组被分为两组,即[3,1,0,9,7],[5,4,8,6,2],对这两组分别进行直接插入排序,可以看到,整个数组的有序程度更进一步了。
  3. 再次缩小增量,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数据结构 收录点击订阅专栏 , 持续更新中。
 创作不易,如果你有任何问题,欢迎私信,感谢您的支持!

排序算法图解(四):希尔排序相关推荐

  1. js排序算法详解-希尔排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...

  2. 希尔排序是一种稳定的排序算法_全面解析十大排序算法之四:希尔排序

    点击上方蓝字关注我们吧 1. 十种排序算法的复杂度和稳定性 时间复杂度:一个算法消耗所需要的时间 空间复杂度:运行一个算法所需要的内存时间 稳定性:如一个排列数组:1.4.5.6.4.7. 此时有一对 ...

  3. 算法-22-字符串的排序算法(四种排序)

    目录 1.字符串 1.1.属性 1.2.字母表 2.字符串排序方法 3.键索引计数法 3.1.第一步:频率统计 3.2.第二步:将频率转换为索引 3.3.第三步:数据分类排序 3.4.第四步:回写排序 ...

  4. 排序算法研究之希尔排序(shell sort)

    前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序本节,我们介绍插入排序的改进版的希尔排序. 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接 ...

  5. python实现希尔排序算法_python实现希尔排序算法

    希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...

  6. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  7. [ 数据结构 -- 手撕排序算法第四篇 ] 选择排序

    手撕排序算法系列之第四篇:选择排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算 ...

  8. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  9. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

最新文章

  1. windows 80端口被占用的解决方法
  2. 如何忽略Git中目录中的文件?
  3. oracle查看列数据类型
  4. 笔记本显示器仅计算机,将笔记本电脑(仅一个HDMI接口)连接到双屏幕(谨慎使用)的解决方案...
  5. JavaScript内存泄漏知多少?
  6. 在mysql-workbench中运行set和declare并且观察区别
  7. 求一份100行左右的C语言程序,求4个C语言程序 每个100行左右 大一水平的
  8. 分布式消息中间件之kafka设计思想及基本介绍(一)
  9. 自学Android到什么程度才能找到工作?
  10. 手机签名工具_iOS越狱神器复活!自签工具 ReProvision 又可以愉快使用了
  11. android强制开启深色模式bug,强制深色模式软件
  12. 嵌入式arm(一)学ARM要掌握的预备知识(本篇文章持续更新)
  13. 摄像头相关控制器集合
  14. 苹果手机怎么验证app_【图文】苹果手机如何下载安装APP
  15. 移动 webApp 开发入门与进阶
  16. Pokémon Army (easyversion) -每天一把CF - 20201007
  17. Exchange 常见问题之十
  18. origin中文版散点图拟合曲线_origin中两组数已经画出散点图,如何新增类似于excel中的趋势线?而且是幂函式的,求高手指点...
  19. oracle in函数的使用,oracle in 函数
  20. 阿里云服务器优势和特点

热门文章

  1. 图解原型链及其继承优缺点
  2. 【整车Silmulink模型】(三)驾驶员模型方向盘转角控制
  3. CHJ_MarkDown
  4. 吴军:厉害的人是这样为人处世的
  5. java8安装包打不开_Win7系统下安装JDK提示“无法打开此安装包请确认该程序包存在”怎么办?...
  6. Oracle数据库安装容易出错问题的解决方案
  7. 大企业邮箱品牌排行中,哪个企业邮箱好用?
  8. 复用浏览器之跳过扫码登录
  9. 211硕士 进大厂美团亲身经验分享-面试不算难(学累了进来看看)
  10. Digitalize Your Supply Chain 数字化供应链解析