【排序算法】希尔排序

一:基本介绍

插入排序介绍

1.1 插入排序存在问题

我们看简单的插入排序可能存在的问题
数组 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}

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

1.2 希尔排序法介绍

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

1.3 希尔排序法基本思想

希尔排序终点在于分组。分组的规律:数组长度除以2。即[low+(high-low)]/2;以此作为增量。让每组的同号相互比较。(注意:如果数组是奇数,则会导致分组平均,会产生第三个组,则让这组数据与前一组相比较)

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

1.4 希尔排序算法图解

以序列: {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],进行一次插入排序,即可实现数组的有序化(仅需要简单微调,而无需大量移动操作)。

二:代码实现

2.1 交换法

import java.util.Arrays;/*** 希尔排序*/
public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};shellSort(arr);}/*** 使用逐步推导的方式来编写希尔排序*/public static void shellSort(int[] arr) {int temp = 0;int count = 0;//使用循环处理for (int gap = arr.length / 2; gap > 0; gap = gap / 2) {//希尔排序的第一轮//因为第一轮排序,将10个数据分成了5组for (int i = gap; i < arr.length; i++) {//遍历各组中的所有元素(共gap组,每组有元素),步长gapfor (int j = i - gap; j >= 0; j = j - gap) {//如果当前元素大于加上步长后的那个元素,说明交换if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}System.out.println("希尔排序第" + (++count) + "轮排序后:" + Arrays.toString(arr));}}
}

在这里插入图片描述
测试80000条数据的排序时间

public static void main(String[] args) {long start = System.currentTimeMillis();int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {//Math.random() * 80000生成0到100的随机数arr[i] = (int) (Math.random() * 80000);}shellSort(arr);long end = System.currentTimeMillis();System.out.println("执行时间为:" + (end - start));}

在这里插入图片描述
排序80000条数据的时间大约为:7秒左右。

2.2 移动法

/*** 对交换式的希尔排序进行优化,使用移位法的思路实现** @param arr 需要排序的数组*/public static void shellRemoveSort(int[] arr) {//增量gap,并逐步的缩小增量for (int gap = arr.length / 2; gap > 0; gap = gap / 2) {//从第gap个元素,并逐个对其所在的组进行直接插入排序for (int i = gap; i < arr.length; i++) {int j = i;int temp = arr[j];if (arr[j] < arr[j - gap]) {while (j - gap > 0 && temp < arr[j - gap]) {//移动arr[j] = arr[j - gap];j = j - gap;}//退出while循环后,就给temp找到了对应的插入位置arr[j] = temp;}}}}

测试80000条数据的排序时间

public static void main(String[] args) {int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {//Math.random() * 80000生成0到100的随机数arr[i] = (int) (Math.random() * 80000);}long start = System.currentTimeMillis();shellExchangeSort(arr);long end = System.currentTimeMillis();System.out.println("shellExchangeSort执行时间为:" + (end - start));long s = System.currentTimeMillis();shellRemoveSort(arr);long e = System.currentTimeMillis();System.out.println("shellRemoveSort执行时间为:" + (e - s));}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI猫图片展示

AI猫展示 文章目录 AI猫展示

【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

计算机网络:物理层(奈氏准则和香农定理,含例题)

带你速通计算机网络期末 文章目录 一、码元和带宽 1、什么是码元 2、数字通信系统数据传输速率的两种表示方法 2.1、码元传输速率 2.2、信息传输速率 3、例题 3.1、例题1 3.2、例题2 4、带宽 二、奈氏准则&#xff08;奈奎斯特定理&#xff09; 1、奈氏准则简介 2、…

如何选择适合的公共 DNS

中国国内一些公共 DNS 服务 腾讯 DNSPod Anycast&#xff1a;上海、天津、广州、香港 DNS 出口&#xff1a;上述四点 TCP 查询&#xff1a;不支持 DoT、DoH&#xff1a;支持。域名 dns.pub 和 doh.pub&#xff0c;同时支持 DoH 和 DoT ECS&#xff1a;不完整支持 https://www.…

【python并发任务的几种方式】

文章目录 1 Process:2 Thread:3 ThreadPoolExecutor:4 各种方式的优缺点&#xff1a;5 线程与进程的结束方式5.1 线程结束的几种方式5.2 进程的结束方式 6 应用场景效率对比 在Python中&#xff0c;有几种方法可以处理并行执行任务。其中&#xff0c;Process、Thread和ThreadPo…

SQL进阶理论篇(三):什么是索引

文章目录 简介索引是万能的吗索引的种类有哪些&#xff1f;普通/唯一/主键/全文索引聚集索引与非聚集索引单一索引与联合索引 总结参考文献 简介 索引在SQL优化中占了很大的比重&#xff0c;甚至可以说&#xff0c;对SQL的优化&#xff0c;其实就是对索引的优化。 但是索引并…

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件&#xff0c;而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块&#xff08;不管是Jar包还是Apk&#xff09;时&#xff1a; 在PC平台上&#xff0c;该模块包含的每一个Java源码文件都会对应生成一个同文件…

Dubbo连接协议配置基础V2.0.0

Dubbo连接所使用的协议 一、dubbo://协议 1.1、使用场景: Dubbo 缺省协议采用单一长连接和 NIO 异步通讯&#xff0c;适合于小数据量大并发的服务调用&#xff0c;以及服务消费者机器数远大于服务提供者机器数的情况。反之&#xff0c;Dubbo 缺省协议不适合传送大数据量的服…

Flink Window中典型的增量聚合函数(ReduceFunction / AggregateFunction)

一、什么是增量聚合函数 在Flink Window中定义了窗口分配器&#xff0c;我们只是知道了数据属于哪个窗口&#xff0c;可以将数据收集起来了&#xff1b;至于收集起来到底要做什么&#xff0c;其实还完全没有头绪&#xff0c;这也就是窗口函数所需要做的事情。所以在窗口分配器…

计算机组成原理-ATT格式vsIntel格式

文章目录 AT&T格式 vs lntel格式 x86汇编语言是lntel格式&#xff0c;还有一种汇编语言格式是AT&T AT&T格式 vs lntel格式 lntel格式中取主存地址内容未指明长度默认为32位&#xff0c;对应下图中第四行右边的指令 百分号 美元符号 小括号 可用于计算机结构体数组…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

Amazon Q:对话智能赋能企业发展

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 。 在最近举办的亚马逊云科技大会上&#xff0c;引人瞩目的消息是A…

西米支付:微信支付发布了一则重大公告!从2024年1月8日开始执行。

最近&#xff0c;微信支付发布通告表示对服务商合作协议和规则进行了修订。这次修订进一步明确了收单外包服务机构的备案义务&#xff0c;并加强了对违约合作伙伴的处理措施。 修订后的协议将于2024年1月8日开始生效。 根据修订后的协议&#xff0c;服务商需在开始提供收单外包…

斑马zebra目标检测数据集VOC+YOLO格式2300张

斑马是由四百万年前的原马进化出来的&#xff0c;最早出现的斑马可能是细纹斑马。有关史前马科动物的化石现存于美国爱达荷州克文的克文化石床国家博物馆。斑马的史前马为“克文马”&#xff08;美洲斑马或者克文斑马&#xff09;&#xff0c;学名为“Equussimplicidens”&…

Llinux面试题2

请描述一下 chmod 命令。 答&#xff1a;chmod 命令用于修改文件或目录的权限。它可以添加或删除对文件的读、写和执行权限。 在 Linux 中&#xff0c;如何修改文件的权限&#xff1f; 答&#xff1a;可以使用“chmod”命令来修改文件的权限。例如&#xff0c;通过以下命令将文…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展&#xff0c;众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说&#xff0c;选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大&#xff0c;云服务…

第二步:私有镜像仓库Harbor的使用

前序&#xff1a; &#x1f517;第一步&#xff1a;私有镜像仓库Harbor的安装部署 一、将容器打包为镜像&#xff0c;上传到Harbor 1、查看镜像 输入命令 docker images打印返回 REPOSITORY TAG IMAGE ID CREATED …

Nacos-NacosRule 负载均衡—设置集群使本地服务优先访问

userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 NacosRule 权重计算方法 目录 一、介绍 二、示例&#xff08;案例截图&#xff09; 三、总结 一、介绍 NacosRule是AlibabaNacos自己实现的一个负载均衡策略&…

《教育信息化论坛》期刊杂志论文发表投稿

《教育信息化论坛》由中原大地传媒股份有限公司主管&#xff0c;河南电子音像出版社、文心出版社主办&#xff0c;我刊立足于教育信息化、教育现代化科研&#xff0c;重点介绍国内外信息化、现代化教学手段、教学方式、教学传播研究的新成果和新观点&#xff0c;推广成功的国内…

【嵌入式开发 Linux 常用命令系列 14 -- source hello.sh 和 ./hello.sh 的区别】

文章目录 source hello.sh 和 ./hello.sh 的区别source hello.sh./hello.sh使用场景 source hello.sh 和 ./hello.sh 的区别 问题背景&#xff1a; 创建了目录~/.local/bin 并将其在.bashrc文件中添加到path 中&#xff0c;export PATH$PATH:/home/sam/.local/bin。 在 ~/.loc…