数据结构与算法(Java版) | 详解十大经典排序算法之一:希尔排序

news2024/12/28 3:16:37

接下来,我来给大家讲解第四种排序算法,即希尔排序。

简单插入排序所存在的问题

在上篇文章中,我已经给大家讲解完插入排序了,虽说是讲完了,但在这里我还是想请大家开动脑筋思考一下,就是咱们讲解的插入排序有没有什么所谓的问题。这里,我就直接跟大家说了,肯定是存在问题的,至于是什么问题,下面我就来给大家分析。

假设现在有{2, 3, 4, 5, 6, 1}这样一个数组,如果此时此刻我们想为1(数组里面的最小元素)进行插入,那么插入的过程是不是就应该是下面这个样子啊!

  1. 由于待插入数(即1)小于有序表最后那个元素(即6),因此我们会让6后移,这样,待排序数组就变成{2, 3, 4, 5, 6, 6}这个样子了;
  2. 同上,5也会后移,后移之后,待排序数组就变成{2, 3, 4, 5, 5, 6}了;
  3. 同上,4也会后移,后移之后,待排序数组就变成{2, 3, 4, 4, 5, 6}了;
  4. 同上,3也会后移,后移之后,待排序数组就变成{2, 3, 3, 4, 5, 6}了;
  5. 同上,2也会后移,后移之后,待排序数组就变成{2, 2, 3, 4, 5, 6}了;
  6. 最后,当退出while循环时,说明我们已然找到了待插入数(即1)它所要插入的那个位置,也即索引0处,找到之后,那我们自然就是要进行插入了,插毕,待排序数组就变成{1, 2, 3, 4, 5, 6}这个样子了,也就是说,此刻待排序数组才变得有序。

经过以上分析,相信大家应该不难得知这样一个结论吧,即在进行插入排序时,如果我们假定是要按从小到大的顺序来排序,那么当需要插入的数是较小的数时,后移的次数就会明显增多,随之而来的,便是效率就会受到影响了。而这也从另一方面说明,我们在考虑一个算法的时候,必须去考虑到它最差的那种情况,是不是啊!

以上就是简单插入排序可能存在的一个问题。而正是鉴于此,我们才提出了另外一种排序算法,即希尔排序,可以这样说,希尔排序是我们对简单插入排序优化之后的一种排序算法。

基本介绍

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

基本思想

简单认识希尔排序之后,接下来我就要来给大家详细说说它的排序思想了。

希尔排序的基本思想是这样子的,即希尔排序是把记录按下标的一定增量分组,分组之后,再来对每一组使用直接插入排序算法进行排序;而随着增量的逐渐减少,每一组包含的关键词也将会越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止了。

可能我这样讲,有些同学会觉得比较抽象,不过没关系啊,下面我会给大家看一个希尔排序的思路图解,相信大家看完过后自然就会明白我上面讲的希尔排序的基本思想了。

说啊,目前有一个数组,它的初始状态是下面这样子的。

在这里插入图片描述

从上可以看到,咱们的原始数组一共有10个元素,而且还没有顺序,是不是啊,此外,它里面最小的那个元素(即0)还被我们放在了最后,这是不是就符合上面我们所说的简单插入排序可能会存在问题的这样一个情况啊!因此,这里我们就不能再使用简单插入排序算法了,那不使用简单插入排序算法,应该使用什么呢?使用简单插入排序经过改进之后的一个更高效的版本的排序算法,即希尔排序。

注意,这里还有一点我得给大家说明一下,就是我画的希尔排序的思路图解中,你看到的那些颜色相同的数据元素,它们是一组的。

废话不多说,接下来,我们来针对以上数组进行希尔排序。

首先,将初始增量置为arr.length / 2,即数组的大小除以2,很明显,这儿就是5,初始增量为5,大家知道这意味着什么吗?意味着整个原始数组得被我们分成5组,即{8, 3}{9, 5}{1, 4}{7, 6}{2, 0}

在这里插入图片描述

注意,分组时,我们并不是按照顺序来分的,也即不是说8和9我们分为一组,1和7我们再分为一组,后面依此类推,而之所以不这样分,是因为这样分没有丝毫意义。既然不是按照顺序来分,那又应该怎么分呢?其实,从上图中大家应该就能看出来,分组时我们是利用步长(就是初始增量5)来分的,是不是啊!

上面我们分好组之后,接下来我们就要对这5组分别来进行直接插入排序了。大家看一下,完事过后,待排序数组是不是就变成下面这个样子了!

在这里插入图片描述

应该很好理解吧,你想啊,{8, 3}这组进行直接插入排序,是不是3得插到8的前面啊,同理,后面几组进行直接插入排序,也是这样一个道理,非常简单,因此这里我就不再过多赘述了。

不知道大家有没有发现这一点,就是以上5组数据经直接插入排序之后,像3、5、6这些小元素都被我们调到前面来了,是不是啊,而这也从另一方面说明了,较小元素会被我们快速地弄到前面来。

然后,缩小增量至5 / 2,即2,因为我们得取整嘛!缩小增量至2,大家知道这意味着什么吗?意味着以上数组又得被我们分成2组,即{3, 1, 0, 9, 7}{5, 6, 8, 4, 2}

在这里插入图片描述

很明显,此时我们又得来对这2组分别进行直接插入排序。大家看一下,完事过后,待排序数组是不是就变成下面这个样子了!

在这里插入图片描述

从上可以看到,此时整个数组的有序程度又进了一步。

接着,再缩小增量至2 / 2,即1,很明显,此时,整个数组就只能被我们分成1组了。

在这里插入图片描述

可以看到,经过上面的“宏观调控”,整个数组的有序化程度成果越来越喜人了。

此时,仅仅需要对以上数组简单微调,无需大量移动操作即可完成整个数组的排序。

在这里插入图片描述

总之,随着增量的逐渐缩小,整个数组会越来越接近于一个有序数列,当增量缩减至1时,整个数组恰被分成一组,此时我们仅仅需要对该数组做一次直接插入排序即可完成整个数组的排序,而且还不需要大量后移操作哟!

以上就是我们对希尔排序的一个介绍以及其基本思想的讲解。至于接下来要干嘛,相信大家也都知道了,无非就是来编写具体代码用以实现希尔排序。

代码实现

先来看这样一个案例,说是班级里面有一群小朋友,他们的考试成绩分别是8、9、1、7、2、3、5、4、6和0,现请你对他们的考试成绩按照从小到大的顺序进行排序。

以上案例,相信大家也不难理解其需求,无非就是对一个数组进行希尔排序罢了。

注意,这里有一点我得向大家说明一下,就是使用希尔排序,在对有序序列进行插入时,其实是有两种方式可供我们选择的,一种是交换法,这种方式比较好理解,但就是速度相对较慢;另一种是移动法,这种方式相对不太好理解,但效率会较高。

之所以我在这里要向大家说明这点,是因为待会我们使用希尔排序时,会分别采用这两种方式(即交换法和移动法)来对有序序列进行插入。当然,这里我会先向大家讲解交换法这种方式,因为这种方式比较好理解嘛,等讲解完毕之后,我们再来将其优化成移动法,相信我这样子讲解对大家理解希尔排序应该是非常有帮助的吧!最后,大家千万不要忘了在排序完毕之后来对排序速度进行一个测试哟!

交换法

下面,咱们就来针对{8, 9, 1, 7, 2, 3, 5, 4, 6, 0}这个数组按照从小到大的顺序对其进行排序,当然,这里我们就要使用希尔排序了,而且,使用希尔排序时,我们会采用交换法这种方式来对有序序列进行插入。

废话不多说,下面我们直接开写代码。注意,这里我同样会采用逐步推导的方式来为大家进行讲解,之所以这样做,是因为我觉得这样娓娓道来,大家最后理解起来一定会更加深刻,而且,这也是我的一贯风格。

只是,在正式编写代码之前,我还有一个问题想问一下大家,就是待排序数组目前是总共有10个元素的,我想问大家,希尔排序完之后,你觉得一共会经历几轮排序?是不是3轮啊!对吧!至于原因嘛,。。。

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

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

相关文章

SDK崩溃后怎么打开已有工程

1.进到SDK里面,保留:platform、bsp和工程包(这里是C),其他都删掉 2.windows窗口运行sdk 3.导入sdk工程

基于springboot+vue的4S店车辆管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

人工智能场景下的网络负载均衡技术

AI技术驱动智能应用井喷,智能算力增速远超通用算力。IDC预测,未来五年,我国智能算力规模年复合增长率将超50%,开启数据中心算力新纪元。随着需求激增,数据中心或智算网络亟需扩容、增速、减时延,确保网络稳…

数据结构(三)栈 队列 数组

2024年5月26日一稿(王道P78) 栈 基本概念 基本操作 顺序存储结构 基本操作 共享栈

数据库管理-第194期 网络加速RDMA初探(20240526)

数据库管理194期 2024-05-26 数据库管理-第194期 网络加速RDMA初探(20240526)1 概念2 发展3 使用总结 数据库管理-第194期 网络加速RDMA初探(20240526) 作者:胖头鱼的鱼缸(尹海文) Oracle ACE A…

PLSQL连接Linux Oracle21c

PLSQL连接Linux Oracle21c 一、安装PLsql 下载官网 https://www.allroundautomations.com/registered-plsqldev/ 二、Oracle Instant Client下载 使用plsql连接oracle的时候是需要本地先安装oracle客户端,英文名就是Oracle Instant Client。 官方下载地址&…

RedHat9 | DNS剖析-配置辅助DNS服务器

一、实验环境 1、辅助域名DNS服务器 DNS通过划分为若干个区域进行管理,每一个区域由1台或多台DNS服务器负责解析,如果仅仅采用1台DNS服务器,在DNS服务器出现故障后,用户将无法完成解析。 辅助DNS服务器的优点 容灾备份&#x…

PaddleSeg训练推理及模型转换全流程

文章目录 1、数据准备1.1 数据标注1.2 数据导出1.3 标签较验1.4 数据集整理1.5 标签可视化 2、 模型训练3、模型验证4、模型推理5、模型导出6、导出文件的推理7、将模型转换成onnx8、使用onnx进行推理 本文记录一下使用paddleseg进行语议分割模型对人体进行分割的使用流程。事实…

自然资源-各级国土空间总体规划的审查要点及流程总结

自然资源-各级国土空间总体规划的审查要点及流程总结 国土空间规划是对一定区域国土空间开发保护在空间和时间上作出的安排,包括总体规划、详细规划和相关专项规划。 国土空间规划管理是国土空间规划中重要的一环。中共中央、国务院发布《关于建立国土空间规划体系…

数据与结构--AVL树

目录 AVL树的概念 AVL树的性质 AVL树结点的定义 AVL树的插入 AVL树的旋转 左单旋 右单旋 左右双旋 右左单旋 AVL树的验证 AVL树的查找 AVL树的修改 AVL树的删除 AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率,但如果插入二叉搜索树的数据是…

福昕PDF使用技巧

因为突然间学校的企业版WPS突然很多功能就不能使用了,所以转向福昕PDF。 一、合并文件 添加需要合并的文件,可以使用ctrla等方式全选 找到最上方的“合并文件” 二、文本注释

linux中最常用的文件管理命令

linux中最常用的文件管理命令 linux中最常用的文件管理命令最常用的且没有之一的 ls命令格式不加任何参数使用-l显示更多细节使用-t按照时间排序使用-r按照时间逆序使用-S根据文件大小排序 查看庐山真面貌的cat实例 :简单显示内容实例 :显示行号 -n实例 …

Python实现xml解析并输出到Excel上

1.编写xml文件 2.使用Python的ElementTree模块来解析XML import xml.etree.ElementTree as ET from openpyxl import Workbook # 解析XML函数 def parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot() --打开根节点data []for user in root.findall(Users/Us…

LeetCode 124 —— 二叉树中的最大路径和

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 二叉树的问题首先我们要想想是否能用递归来解决,本题也不例外,而递归的关键是找到子问题。 我们首先来看看一棵最简单的树,也就是示例 1。这样的一棵树总共有六条路径&#xf…

【三维修复、分割与编辑】InFusion、Bootstrap 3D、GaussianGrouping、GaussianEditor等(论文总结)

提示: 文章目录 前言一、InFusion:扩散模型助力,效率提高20倍!(2024)1. 摘要2. 算法3. 效果 二、2D Gaussian Splatting三、Bootstrap 3D:从扩散模型引导三维重建1.摘要2.相关工作3.方法1.Boostrapping by Diffusion 通过扩散模型…

文心一言 VS 讯飞星火 VS chatgpt (267)-- 算法导论20.2 2题

二、写出 PROTO-vEB-DELETE 的伪代码。通过扫描簇内的相关位,来更新相应的 summary 位。并且你实现的伪代码的最坏情况运行时间是多少?如果要写代码,请用go语言。 文心一言: 首先,让我们回顾一下vEB(Van …

项目管理-质量管理

目录 一、质量管理概述 1.1 GB/T16260.1-2006 定义 1.2 GB/T19000-ISO 9000(2000)系列标准定义 二、软件质量模型 2.1 软件全生命周期质量模型 2.1.1 内部和外部质量的质量模型 2.1.2 使用质量的质量模型 2.1.3 McCall 质量模型 2.1.4 质量特性度量 2.1.5 相关概念 三…

对话掌阅科技CTO孙凯:如何用生成式AI重新定义阅读体验

导读:生成式AI能对阅读做本质的改造吗? 读一本好书,犹如和一位智者对话。 对于很多热爱读书的人,这是一种令人憧憬的阅读体验。以往,这种对话只能在读者的头脑和思维中进行。 有没有可能,读者可以随时随地和…

使OpenCV可以读取中文路径图片的方法

一.问题复现 1.代码 #! /usr/bin/env python # -*- coding: utf-8 -*-# File: show_img.pyimport cv2# 读取图片 img cv2.imread("车牌素材/冀A.png")# 显示图片 cv2.imshow("img", img) cv2.waitKey(0)2.报错截图 3.报错内容 [ WARN:00.05…

[JAVASE] 类和对象综合应用 -- 图书管理系统

目录 零. 概览 一. 抽象出图书管理系统所涉及的对象 1.1 Book 1.2 User 1.3 Operation 二. 实现 User 包中的对象 2.1 User父类 2.2 NormalUser 对象 2.3 AdminUser 对象 2.4 小总结(1) 三. 实现Book包中的对象 3.1 Book 对象 3.2 BookList 对象 四. 实现 Operation…