十六、希尔排序即其优化(交换法--->移动法)
一、为何要引入希尔排序
首先先看直接插入排序所存在的弊端,数组 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
十六、希尔排序即其优化(交换法--->移动法)相关推荐
- 希尔排序算法python_python算法(六)希尔排序
python算法(六)希尔排序 希称排序 问题: 将一组乱序的数列,按从小到大(从大到小)的顺序重新排列. 方法: 设定一个初始增量, 对原始数列进行分组: 对每一个分组进行排序 设置一个更小的增量 ...
- ds排序--希尔排序_排序算法 - 希尔排序分析及优化
希尔排序 1 算法思想 希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本. 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是 ...
- 学习随记四十五——希尔排序
希尔排序 1.希尔排序的算法 2.希尔排序的函数代码 3.希尔排序的分析 3.1 时间复杂度 3.2 运行时间实例分析 4. 整体代码: 总结 一些说明:在这里我假设的数组元素可以比较大小,且无重复元 ...
- Java数据结构与算法(六) 希尔排序
###一.希尔排序的产生 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提 ...
- 我的物联网项目(二十六) 商家微信充值流程优化
偶尔有反馈说商家充值成功了,但是商家无充值记录和资金账户没有改变,另外也有反馈第三方微信支付在业务高峰期会有不断的回调尝试,更重要的是问题追踪起来比较繁琐,针对这些对设计进行了重新优化,没有太对的细节 ...
- 极客算法训练笔记(六),十大经典排序之希尔排序,快速排序
目录 抛砖引玉 希尔排序 快速排序 抛砖引玉 十大经典排序算法江山图 十大经典排序算法江山图 排序算法的衡量指标我这里不再重复,上一篇我已经列举分析的很清楚了,但是非常重要,没看到我上一篇的小伙伴墙裂 ...
- 十大经典排序算法解析及优化
前言 在上篇文章<十大经典排序算法(动图演示)>中,已经能够了解各种排序算法的思想逻辑,虽然其中提供了代码,但对其解析却并不够全面,而且使用的是js来进行编写演示.本人根据其上代码转换为P ...
- C++ 十大经典排序算法原理及模板之STL方法实现以及稳定性分析
写在前面: 1.本文中默认排序为升序,降序的原理类似. 2.如果程序直接复制到vs出现无法识别标记的问题,解决方法在这:vs无法识别标记的解决方法 3.本文的算法都是自己用stl实现的,疏漏之处还请指 ...
- 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...
最新文章
- Unable to add window token null is not valid is your activity running
- Docker精华问答 | 如何让一个容器连接两个网络?
- vue的transition组件的使用
- 互联网公司常用MySQL分库分表方案
- python方法调用方法_Python之方法调用
- 台式电脑一直跳一个计算机页面出来,我的电脑界面上莫名其妙的多出了好几个IE浏览器拜托各位了 3Q...
- cad快速选择命令快捷键_CAD人必知的6大CAD操作命令及快捷键
- BS 476-31 与BS 476-33 测试方法是类似的吗?
- 今天将网易博客的内容迁过来
- java数组 处理函数 chunk_数组分组chunk的一种写法
- 工作中如果一直被领导忽略,你会怎么办?
- 通过域名访问路由器配置界面的功能实现
- 金纳米颗粒上装载DNA四面体|金核(75-100nm左右)sio2壳层(3-5nm)产品描述/信息/详情
- 微信公众号自定义分享实现(开发者)
- python运维自动化脚本案例-python自动化运维脚本范例
- Kernel Trick
- 选购笔记本电脑型号的查询
- 阿里云香港服务器最好的停留动力博客:2018年的顶级帖子
- linux没有写的权限问题
- 向这个病毒的编写者致以最高的敬礼!!!(是中国人必顶)