当前位置: 首页 > news >正文

数据结构与算法-希尔排序

引言

        在计算机科学中,数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分,一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序(Shell Sort),深入了解其原理、实现步骤以及优缺点。

一、希尔排序简介

        希尔排序(Shell Sort) 是由Donald Shell在1959年提出的,它是对插入排序的一种改进,通过定义一个增量序列来对原始数据进行分组和预处理,使得每组内的数据相对有序,然后逐步减小增量并最终采用插入排序将所有数据完全排序。

二、希尔排序详细步骤

  1. 初始化增量序列:希尔排序的核心在于使用一系列的间隔(或称增量)对数组进行划分,初始时通常选择一个较大的间隔序列,例如 n/2, n/4, ..., 1(这里的 n 是数组长度)。

  2. 按增量分组排序:对于每一个增量值,将数组划分为多个子序列,每个子序列内部执行插入排序。例如,当增量为 gap 时,将从索引 0 到 gap-1 的元素作为一个子序列,然后是 gap 到 2gap-1 的元素,以此类推。

  3. 递减增量继续排序:重复上述过程,但每次减少一个增量,直到增量为1,此时整个数组被当作一个子序列进行插入排序,完成最后的排序工作。

三、希尔排序的时间复杂度与空间复杂度分析

  • 时间复杂度:希尔排序的时间复杂度取决于增量序列的选择,理论上最佳情况下可以达到O(n log n),但在实际应用中由于难以找到理想的增量序列,一般认为其平均时间复杂度介于O(n^1.3)到O(n^2)之间。

  • 空间复杂度:希尔排序是原地排序算法,不需要额外的存储空间,因此其空间复杂度为O(1)。

四、希尔排序的优缺点

优点

  • 相比于简单插入排序,希尔排序能显著提升对大规模无序数据集的排序效率。
  • 空间效率高,适合内存资源有限的情况。

缺点

  • 时间复杂度依赖于增量序列的选择,如果增量序列选择不当,可能会导致效率降低。
  • 希尔排序并不是稳定的排序算法,相等元素的顺序可能在排序过程中发生变化。

五、希尔排序的图解过程 

图解小结  

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

六、希尔排序的代码实践  

1.展示每一次选择排序过程

//        第一轮
//        应为第一轮排序是将10个数据分成了10 /2 = 五组for (int i = 5; i < arr.length; i++) {
//            遍历各组中所有的元素(共有5组,每组两个元素,步长5)for (int j = i - 5; j >= 0; j -= 5) {
//                如果当前元素大于加上步长后的那个元素,说明需要交换if (arr[j] > arr[j + 5]) {int temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println("第一轮希尔排序为");System.out.println(Arrays.toString(arr));//        第二轮
//        应为第二轮排序是将10个数据分成了5 /2 = 2组for (int i = 2; i < arr.length; i++) {
//            遍历各组中所有的元素(共有5组,每组两个元素,步长5)for (int j = i - 2; j >= 0; j -= 2) {
//                如果当前元素大于加上步长后的那个元素,说明需要交换if (arr[j] > arr[j + 2]) {int temp = arr[j];arr[j] = arr[j + 2];arr[j + 2] = temp;}}}System.out.println("第二轮希尔排序为");System.out.println(Arrays.toString(arr));//        第一轮
//        应为第一轮排序是将10个数据分成了2 /2 =1组for (int i = 1; i < arr.length; i++) {
//            遍历各组中所有的元素(共有5组,每组两个元素,步长5)for (int j = i - 1; j >= 0; j -= 1) {
//                如果当前元素大于加上步长后的那个元素,说明需要交换if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println("第三轮希尔排序为");System.out.println(Arrays.toString(arr));

2.总结规律得到过程 

    public static void shellSort(int[] arr) {
//        有上述可得规律int temp = 0;int count = 0;for (int gap = arr.length / 2; gap > 0; gap /= 2) {count++;for (int i = gap; i < arr.length; i++) {
//                遍历各组中的元素共有gap组,步长为gapfor (int j = i - gap; j >= 0; j -= gap) {if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}System.out.printf("第%d轮希尔排序为", count);System.out.println(Arrays.toString(arr));}}

七、总结 

        虽然希尔排序在理论上的性能不如快速排序、归并排序等高级排序算法,但由于其简单且易于实现的特点,在某些特定场景下仍具有一定的实用价值,比如在硬件资源有限的嵌入式系统中,或者需要快速实现一个基础排序功能时。

        希尔排序是一种早期出现的改进型排序算法,它的提出启示我们可以通过对传统算法进行改良以适应不同的需求场景。尽管希尔排序在现代排序算法家族中并非最优解,但它在理解排序算法优化思路、探索更高效排序策略等方面依然具有重要的学习和研究价值。同时,希尔排序也是我们在实际编程中根据具体问题灵活选择排序算法的一个良好例证。

相关文章:

数据结构与算法-希尔排序

引言 在计算机科学中&#xff0c;数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分&#xff0c;一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;深…...

蓝桥杯算法错题记录

这里写目录标题 本文还在跟新&#xff0c;最新更新时间24/3/91. nextInt () next() nextLine() 的注意事项2 . 转换数据类型int ,string,charint -> string , charstring -> int ,charchar -> int , string 进制转换十六进制转化为10 进制 最大公约数 本文还在跟新&am…...

【Python 图像处理 PIL 系列 13 -- PIL 及 Image.convert 函数介绍】

文章目录 Python PIL 介绍PIL 使用介绍PIL convert 介绍PIL convert 使用示例 Python PIL 介绍 PIL 是 Python Image Library 的简称。PIL 库中提供了诸多用来处理图片的模块&#xff0c;可以对图片做类似于 PS&#xff08;Photoshop&#xff09; 的编辑。比如&#xff1a;改变…...

使用docker datascience-notebook进行数据分析

Jupyter/datascience-notebook 简介 jupyter/datascience-notebook 是 Docker Hub 上可用的 Docker 镜像&#xff1a;https://hub.docker.com/。该镜像提供了一个开箱即用的环境&#xff0c;用于数据科学任务&#xff0c;包括&#xff1a; Jupyter Notebook: 一个基于 Web 的…...

VR全景技术在VR看房中有哪些应用,能带来哪些好处

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在房地产行业中的应用也越来越广泛。其中&#xff0c;VR全景技术在VR看房中的运用尤为突出。今天&#xff0c;让我们一起深入探讨VR全景技术在VR看房中的应用及其带来的种种好处。 一、…...

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…...

java网络编程 01 IP,端口,域名,TCP/UDP, InetAddress

01.IP 要想让网络中的计算机能够互相通信&#xff0c;必须为计算机指定一个标识号&#xff0c;通过这个标识号来指定要接受数据的计算机和识别发送的计算机&#xff0c;而IP地址就是这个标识号&#xff0c;也就是设备的标识。 ip地址组成&#xff1a; ip地址分类&#xff1a;…...

第十篇 - 如何利用人工智能技术做好营销流量整形管理?(Traffic Shaping)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市​​​​​​​。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先…...

npm ERR! errno -13具体问题处理

npm ERR! errno -13具体问题处理 出现问题的报错 npm ERR! code EACCES npm ERR! syscall open npm ERR! path /Users/xxxx/.npm/_cache/index-v5/c6/06/xxxxx npm ERR! errno -13 npm ERR! npm ERR! Your cache folder contains root-owned files, due to a bug in npm ERR! …...

【Python】3. 基础语法(2) -- 语句篇

顺序语句 默认情况下, Python 的代码执行顺序是按照从上到下的顺序, 依次执行的. print("1") print("2") print("3")执行结果一定为 “123”, 而不会出现 “321” 或者 “132” 等. 这种按照顺序执行的代码, 我们称为 顺序语句. 这个顺序是很关…...

IPsec VPN之安全联盟

一、何为安全联盟 IPsec在两个端点建立安全通信&#xff0c;此时这两个端点被称为IPsec对等体。安全联盟&#xff0c;即SA&#xff0c;是指通信对等体之间对某些要素的约定&#xff0c;定义了两个对等体之间要用何种安全协议、IP报文的封装方式、加密和验证算法。SA是IPsec的基…...

012集——显示高考天数倒计时——vba实现

以下代码实现高考倒计时&#xff1a; Sub 高考倒计时() 高考日期 CDate("06,07," & Year(Date)) If Date > 高考日期 Then高考日期 CDate("06-07-" & Year(Date) 1) End If 年月日 Year(Date) & "年" & Month(Date) &am…...

1.1 深度学习和神经网络

首先要说的是&#xff1a;深度学习的内容&#xff0c;真的不难。你要坚持下去。 神经网络 这就是一个神经网络。里面的白色圆圈就是神经元。神经元是其中最小的单位。 神经网络 单层神经网络&#xff1a; 感知机 &#xff08;双层神经网络&#xff09; 全连接层&#xff1a; …...

sentinel docker 基础配置学习

1&#xff1a;去官网下载 Releases alibaba/Sentinel GitHub 2&#xff1a;保存到linux 3&#xff1a;编写dockerfile FROM openjdk:8-jreLABEL authors"xxx" #第二步创建一个文件夹Z RUN mkdir /app #第三步复制jar 到app 下 COPY xxxxxx-1.8.7.jar /app/#第四…...

与缓存相关的状态码

与缓存相关的 HTTP 状态码主要涉及客户端和服务器之间对资源缓存的处理和验证&#xff0c;以下是一些常见的与缓存相关的状态码&#xff1a; 1. **200 OK**&#xff1a; - 当服务器成功处理了客户端的请求时&#xff0c;会返回状态码 200 OK。这意味着请求成功&#xff0c;…...

影刀_如何点击桌面图片上的指定区域

问题&#xff1a;如图&#xff0c;桌面上有一张打开的图片&#xff0c;如何点击“J&T极兔快递”的左上角和右下角&#xff1f; 总体流程&#xff1a; 1、用“影刀离线OCR”指令获取目标区域坐标值。 分别是&#xff1a;x1,y1,x2,y2 2、用快捷键ctrlalt键获取图片左上角的…...

linux安装部署mmdetection,亲测可行

安装了两天&#xff0c;最后终于成功&#xff0c;这里有一些注意事项&#xff0c;版本对应啥的&#xff1a; 这里是mmdetection与MMCV的版本对应关系&#xff1a; mmdet与mmcv的版本对应有一些包因为版本问题直接pip下载不了&#xff0c;这里直接跑到官网去复制下载命令&#…...

redis常见问题

目录 一、缓存穿透 二、缓存击穿 三、缓存雪崩 四、redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢?(双写一致性) 五、redis做为缓存&#xff0c;数据的持久化是怎么做的? 六、数据过期策略 七、数据淘汰策略 八、Redis分布式锁使用场景 九、Redis分布…...

Java虚拟机(JVM)元数据区存放的内容

类元数据 元数据区&#xff08;在HotSpot虚拟机中也称为Metaspace&#xff09;主要存放了类的元数据信息&#xff0c;如类的名称、访问修饰符、常量池、字段描述、方法描述等。 运行时常量池 运行时常量池是每个类或接口的常量池表的运行时表示形式&#xff0c;包含了若干种不…...

wifi连接上后是怎么提供网络的?

干了六个月的网络协议栈&#xff0c;又回到了wifi老本行&#xff0c;所以我最近又开始研读 Android wifi fwk的源码了 之前还在干wifi的时候就思考过一个问题&#xff0c;wifi区别于蓝牙的一个很明显的点是&#xff0c;wifi可以提供 access to Internet 所以我想看看wifi连接成…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...