一、为何要引入希尔排序

首先先看直接插入排序所存在的弊端,数组 arr = {2,3,4,5,6,1},如果要插入的数1(最小),这样的过程是:
{2,3,4,5,6,6}
{2,3,4,5,5,6}
{2,3,4,4,5,6}
{2,3,3,4,5,6}
{2,2,3,4,5,6}
{1,2,3,4,5,6}

结论:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响

二、希尔排序的介绍

希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

三、希尔排序的基本思想

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

四、希尔排序的示意图


五、希尔排序的代码实现(普通交换法----》优化移动法)

package cn.zzw.algorithm.sort1;import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.util.Arrays;public class ShellSort {public static void main(String[] args) {int[] array={8,9,1,7,2,3,5,4,6,0};//优化前的希尔排序(交换法)//ShellSort(array);//优化后的希尔排序(移动法)ShellSort2(array);}//这是未经优化的希尔排序算法(交换法),效率甚至比普通的直接插入排序都低public static void ShellSort(int array[]){int gap=array.length/2;int count=0;while (gap>0){for(int i=gap;i<array.length;i++){for(int j=i-gap;j>=0;j-=gap){if(array[j]>array[j+gap]){int temp=array[j];array[j]=array[j+gap];array[j+gap]=temp;}}}gap=gap/2;System.out.println("希尔排序优化前第"+(++count)+"趟希尔排序的结果为:"+ Arrays.toString(array));}}//优化后的希尔排序(移动法),效率很高,八万个数据进行排序大约只需要一秒public static void ShellSort2(int array[]){int gap=array.length/2;int count=0;while (gap>0){for(int i=gap;i<array.length;i++){int InsertValue=array[i];int InsertIndex=i-gap;while (InsertIndex>=0 && InsertValue<array[InsertIndex]){//往后移动array[InsertIndex+gap]=array[InsertIndex];InsertIndex=InsertIndex-gap;}array[InsertIndex+gap]=InsertValue;}gap=gap/2;System.out.println("希尔排序优化后第"+(++count)+"趟希尔排序的结果为:"+ Arrays.toString(array));}}
}

测试结果:

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=26323:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.sort1.InsertSort
第1趟排序结果为:[1, 4, 3, 6, 7, 9, 5]
第2趟排序结果为:[1, 3, 4, 6, 7, 9, 5]
第3趟排序结果为:[1, 3, 4, 6, 7, 9, 5]
第4趟排序结果为:[1, 3, 4, 6, 7, 9, 5]
第5趟排序结果为:[1, 3, 4, 6, 7, 9, 5]
第6趟排序结果为:[1, 3, 4, 5, 6, 7, 9]
最终的排序结果为:[1, 3, 4, 5, 6, 7, 9]Process finished with exit code 0

十六、希尔排序即其优化(交换法--->移动法)相关推荐

  1. 希尔排序算法python_python算法(六)希尔排序

    python算法(六)希尔排序 希称排序 问题: 将一组乱序的数列,按从小到大(从大到小)的顺序重新排列. 方法: 设定一个初始增量, 对原始数列进行分组: 对每一个分组进行排序 设置一个更小的增量 ...

  2. ds排序--希尔排序_排序算法 - 希尔排序分析及优化

    希尔排序 1 算法思想 希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本. 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是 ...

  3. 学习随记四十五——希尔排序

    希尔排序 1.希尔排序的算法 2.希尔排序的函数代码 3.希尔排序的分析 3.1 时间复杂度 3.2 运行时间实例分析 4. 整体代码: 总结 一些说明:在这里我假设的数组元素可以比较大小,且无重复元 ...

  4. Java数据结构与算法(六) 希尔排序

    ###一.希尔排序的产生 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提 ...

  5. 我的物联网项目(二十六) 商家微信充值流程优化

    偶尔有反馈说商家充值成功了,但是商家无充值记录和资金账户没有改变,另外也有反馈第三方微信支付在业务高峰期会有不断的回调尝试,更重要的是问题追踪起来比较繁琐,针对这些对设计进行了重新优化,没有太对的细节 ...

  6. 极客算法训练笔记(六),十大经典排序之希尔排序,快速排序

    目录 抛砖引玉 希尔排序 快速排序 抛砖引玉 十大经典排序算法江山图 十大经典排序算法江山图 排序算法的衡量指标我这里不再重复,上一篇我已经列举分析的很清楚了,但是非常重要,没看到我上一篇的小伙伴墙裂 ...

  7. 十大经典排序算法解析及优化

    前言 在上篇文章<十大经典排序算法(动图演示)>中,已经能够了解各种排序算法的思想逻辑,虽然其中提供了代码,但对其解析却并不够全面,而且使用的是js来进行编写演示.本人根据其上代码转换为P ...

  8. C++ 十大经典排序算法原理及模板之STL方法实现以及稳定性分析

    写在前面: 1.本文中默认排序为升序,降序的原理类似. 2.如果程序直接复制到vs出现无法识别标记的问题,解决方法在这:vs无法识别标记的解决方法 3.本文的算法都是自己用stl实现的,疏漏之处还请指 ...

  9. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

    独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...

最新文章

  1. Unable to add window token null is not valid is your activity running
  2. Docker精华问答 | 如何让一个容器连接两个网络?
  3. vue的transition组件的使用
  4. 互联网公司常用MySQL分库分表方案
  5. python方法调用方法_Python之方法调用
  6. 台式电脑一直跳一个计算机页面出来,我的电脑界面上莫名其妙的多出了好几个IE浏览器拜托各位了 3Q...
  7. cad快速选择命令快捷键_CAD人必知的6大CAD操作命令及快捷键
  8. BS 476-31 与BS 476-33 测试方法是类似的吗?
  9. 今天将网易博客的内容迁过来
  10. java数组 处理函数 chunk_数组分组chunk的一种写法
  11. 工作中如果一直被领导忽略,你会怎么办?
  12. 通过域名访问路由器配置界面的功能实现
  13. 金纳米颗粒上装载DNA四面体|金核(75-100nm左右)sio2壳层(3-5nm)产品描述/信息/详情
  14. 微信公众号自定义分享实现(开发者)
  15. python运维自动化脚本案例-python自动化运维脚本范例
  16. Kernel Trick
  17. 选购笔记本电脑型号的查询
  18. 阿里云香港服务器最好的停留动力博客:2018年的顶级帖子
  19. linux没有写的权限问题
  20. 向这个病毒的编写者致以最高的敬礼!!!(是中国人必顶)

热门文章

  1. HTML全局属性data-
  2. OpenCV官方文档
  3. Tensorflow |(3)变量的的创建、初始化、保存和加载
  4. 《机器学习Python实践》——数据导入(CSV)
  5. GROMACS运行参数之md.mdp文件详解
  6. Ubuntu14.04安装NVIDIA驱动后之后无法进入图形界面
  7. NetLogo入门(一)——熟悉操作界面
  8. classname帝国怎么用php调用,帝国cms怎么调用栏目别名
  9. RStuido Server 选择不同的 R 版本(conda 中的不同 R 版本)
  10. Soil Ecology Letters被ESCI收录