【排序算法】②希尔排序

系列文章目录

 第一篇:【排序算法】①直接插入排序-CSDN博客

第二篇:【排序算法】②希尔排序-CSDN博客

第三篇:【排序算法】③直接选择排序-CSDN博客

第四篇:【排序算法】④堆排序-CSDN博客

第五篇:【排序算法】⑤冒泡排序-CSDN博客

第六篇:【排序算法】⑥快速排序:Hoare、挖坑法、前后指针法-CSDN博客

第七篇:【排序算法】⑦归并排序-CSDN博客


目录

系列文章目录

前言

一、希尔排序是什么?

算法思想

二、为什么希尔排序能做到排序?

三、实现希尔排序

四、分析希尔排序

总结



前言

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

为什么我们要学习排序?笔者认为有两点理由:一是面对浩如烟海的各种数据,我们应该学习如何分类、控制这些数据,而排序自然是少不了的;二是人类社会从古至今一直在“排序”,人与人之间,物与物之间,排序涉及到社会的方方面面。

学习并理解排序,不仅有助于工作学习,或许对一些其他方面的理解也会起动到推的效果。


一、希尔排序是什么?

希尔排序法又称缩小增量法,是在直接插入排序的基础上进行优化得来的排序算法。

算法思想

希尔排序法的基本思想是:先选定一个间距整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行直接插入排序。然后,gap--,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。

简单来说,希尔排序分为“预排序”和“正式排序”两步。


二、为什么希尔排序能做到排序?

这里笔者画了草图以帮助大家理解希尔排序:

假设我们排升序,数组为{7 ,1 ,3 ,9 ,6 ,5 ,4 ,8 ,2 ,0}

假设设gap=3:

此时将gap-1,在再上一次排序的基础上排:

gap=2,数组为{0,1,2,4,6,3,7,8,5,9}

再将gap-1,此时gap==1,实质上成为直接插入排序。

为什么要分几次预排序,然后还要调用直接插入排序?

还记得插入排序什么时候效率最高吗,当数组接近有序的时候!预排序的过程其实就是让数组接近有序,为后面的gap=1时的插入排序做准备,也就是说希尔排序的最后一步必须是gap==1时的直接插入排序!

三、实现希尔排序

void ShellSort(int* a, int n)
{if (!a)return;int gap = n;//gap>1:确保最后一趟gap==1while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - 1; i += gap){int end = i;int temp = a[end + gap];while (end >= 0&&end+gap<n){//if (temp > a[end])递减if(temp < a[end])//递增{a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = temp;}}
}

代码讲解:

①gap=gap/3,通过将gap/3快速将整个区间划分为多个小区间进行预处理操作。这里除以3是基于前人所做的大量总结中得出的最优解:在效率和计算复杂度间取得平衡。

若gap/2,则递减过慢且中间需要较多次的预排序过程;若gap/>3的数,则递减过快,难以达成预排序的目的:让数组变得尽量有序。

②gap=gap/3+1,这个+1的目的是确保gap永不小于 1,并且使得最后一次循环必定执行gap==1时的直接插入排序。

③for循环中实质为直接插入排序,在上一篇中已经介绍过,若读者有疑惑的地方欢迎在评论区讨论。


四、分析希尔排序

1. 希尔排序是对直接插入排序的优化。


2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

3.时间复杂度:希尔排序的时间复杂度较难计算,需要用到数学中的概率论证明,这里就省略证明过程,希尔排序的时间复杂度随gap的变化而变化,上述代码中的gap=gap/3+1的时间复杂度为O(N^1.3);

4.空间复杂度为O(1);

5.稳定性分析:不稳定!希尔排序的不稳定性源于它在排序过程中会进行长距离的元素交换,这可能导致相同值的元素在排序后改变相对顺序。

比如:数组{5A, 2, 1 , 5B, 3}(5A和5B是值相同但需区分顺序的两个元素),希尔排序最后结果为{1,2,3,5B,5A},排序前5A在5B前,排序后5A在5B后!


总结

本文是【排序算法】系类第二篇,主要介绍了什么希尔排序,以及如何实现希尔排序,最后分析了希尔排序的特性。

希望对你有所帮助。

阅完点赞,手留余香~

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

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

相关文章

Linux Shell为文件添加BOM并自动转换为unix格式

1.添加并查看BOM添加bomvim -c "set bomb|set fileencodingutf-8|wq" ./gradlew查看bomhead -c 3 ./gradlew | hexdump -C2.安装dos2unix并转换为unix格式安装sudo apt install dos2unix转换dos2unix ./gradlew

华清远见25072班C语言学习day5

重点内容&#xff1a;数组&#xff1a;为什么有数组&#xff1f;为了便于存储多个数据特点&#xff1a;连续存储多个同种数据类型元素(连续指内存地址连续)数组名&#xff1a;数组中首元素的地址&#xff0c;是一个地址常量。一维整形数组&#xff1a;定义&#xff1a;数据类型…

安全守护,温情陪伴 — 智慧养老产品上新

- 养老智慧看护终端接入萤石开放平台 - 在2025 ECDC萤石云开发者大会&#xff0c;萤石产品经理已经介绍了基于萤石云服务AI能力适老化设备的养老智能能力开放。 而今天&#xff0c;养老智慧看护终端再升级&#xff0c;集成跌倒检测、物理隐私遮蔽、火柴人遮蔽、AI语音智能体…

鸿蒙flutter项目接入极光推送

推送的自分类权益 需要审核15个工作日&#xff0c;实际约3个工作日 项目使用极光推送flutter代码&#xff0c;代码端已经配置的东西&#xff08;需要配置flutter端和对应各自平台原生端&#xff09;&#xff0c;我的工程是多target&#xff0c;所以和单target有一点不同。 一、…

2025牛客多校第八场 根号-2进制 个人题解

J.根号-2进制 #数学 #FFT 思路 赛后发现身边的同学都是通过借位来解决进位问题的&#xff0c;在此提供一种全程不出现减法的顺推做法 首先A,BA,BA,B可以理解为两个多项式&#xff1a;A0A1−2A2(−2)2…A_{0}A_{1}\sqrt{ -2 }A_{2}(\sqrt{ -2 })^2\dotsA0​A1​−2​A2​(−…

DataEase官方出品丨SQLBot:基于大模型和RAG的智能问数系统

2025年8月7日&#xff0c;DataEase开源项目组发布SQLBot开源项目&#xff08;github.com/dataease/SQLBot&#xff09;。SQLBot是一款基于大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;和RAG&#xff08;Retrieval Augmented Generation&#xff0c;…

第十四节 代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。介绍意图&#xff1a;为其他对象提供一种代理以控制对…

训推一体 | 暴雨X8848 G6服务器 x Intel®Gaudi® 2E AI加速卡

近日&#xff0c;暴雨信息携手英特尔&#xff0c;针对Gaudi 2E AI加速器HL-288 PCIe卡&#xff08;简称IntelGaudi 2E PCIe卡&#xff0c;下同&#xff09;完成专项调优与适配工作&#xff0c;并重磅推出Intel Eagle Stream平台4U8卡解决方案。该方案通过软硬件协同优化&#x…

GB17761-2024标准与电动自行车防火安全的技术革新

随着我国电动自行车保有量突破3.5亿辆&#xff0c;这一便捷的交通工具已成为城市出行的重要组成。然而&#xff0c;伴随市场规模扩大而来的是日益突出的安全问题——2023年全国电动自行车火灾事故高达2.5万起&#xff0c;年均增长率约20%&#xff0c;火灾中塑料件加速燃烧并释放…

利用容器编排完成haproxy和nginx负载均衡架构实施

1 创建测试目录和文件[rootdocker-a ~]# mkdir lee [rootdocker-a ~]# cd lee/ [rootdocker-a lee]# touch docker-compose.yml # 容器编排工具Docker Compose 默认识别docker-compose.yml文件2 编写docker-compose.yml文件和haproxy.cfg文件2.1 核心配置说明2.1.1 服务结构共定…

WinRAR v7.13 烈火汉化稳定版,解压缩全格式专家

[软件名称]: WinRAR v7.13 烈火汉化稳定版 [软件大小]: 3.8 MB [下载通道]: 夸克盘 | 迅雷盘 软件介绍 WinRAR 压缩文件管理器&#xff0c;知名解压缩软件&#xff0c;电脑装机必备软件&#xff0c;国内最流行最好用的压缩文件管理器、解压缩必备软件。它提供 RAR 和 ZIP 文…

强化学习常用数据集

强化学习常用数据集数学推理数据集数值标签GSM8K&#xff08;2021 OpenAI)问答数据集在LLM场景下进行强化学习训练的时候&#xff0c;时常会涉及到各种各样的数据集&#xff0c;容易记不住&#xff0c;因此开个帖子记录一下。可采取的分类方法有很多&#xff0c;这里直接按照领…

ROS2学习(1)—基础概念及环境搭建

文章目录核心框架环境搭建小乌龟机器人控制小乌龟启动键盘控制启动rqt查看ros节点关系核心框架 这里有几个比较重要的概念&#xff1a; 四大通信机制&#xff1a;话题&#xff08;Topic&#xff09;、服务&#xff08;Service&#xff09;、动作&#xff08;Action&#xff09…

基于STM32单片机超声波测速测距防撞报警设计

1 系统功能介绍 本设计是一套基于 STM32F103C8T6 单片机 的超声波测速测距防撞报警系统&#xff0c;能够实现对目标物体的实时测距与测速&#xff0c;并通过 TFT 彩屏进行动态显示&#xff0c;同时根据用户设定的距离与速度阈值进行报警提示。该系统不仅可以用于固定场景的安全…

麒麟系统播放 pptx

目录 python 操作 LibreOffice 控制pptx 一页一页播放 1. 安装 LibreOffice&#xff08;麒麟系统基于 Debian/Ubuntu&#xff09; 2. 如果只想安装 PPT 播放/转换&#xff08;Impress&#xff09; 1. 启动 LibreOffice UNO 服务 2. Python 控制播放uno安装方法&#xff1a…

嵌入式Linnux学习 -- 软件编程2

四、IO1. 概念1. IO 指 input / output2. Linux系统中一切皆是文件3. IO操作的对象是文件2. 文件1. 概念一段数据的集合2. 特点文件通常存放在外存中&#xff0c;掉点后数据不会丢3. 分类b&#xff08;block&#xff0c;块设备文件&#xff09;-- 按块扫描信息的文件&#x…

Spark02 - SparkContext介绍

一、应用入口&#xff1a;SparkContextSpark Application 程序入口为&#xff1a;SparkContext&#xff0c;任何一个应用首先需要构建 SparkContext 对象&#xff0c;如下两步构建&#xff1a;第一步、创建 SparkConf 对象设置 Spark Application 基本信息&#xff0c;比如应用…

Selenium动态元素定位

动态元素定位方法一&#xff1a;使用CSS选择器通过部分匹配操作符定位动态属性中的固定部分。*&#xff08;包含&#xff09;&#xff0c;^&#xff08;开头&#xff09;&#xff0c;$&#xff08;结尾&#xff09;。/* 匹配id前缀为user_的元素 */ cssdiv[id^"user_"…

OBOO鸥柏丨115寸商用屏/工业液晶显示器招标投标核心标底参数要求

整机参数要求&#xff1a;商用液晶显示器/工业LCD一体机/商业智能终端机/工业防爆显示器/招标投标核心标底参数要求1、整机屏幕采用≥采用115英寸超高清原厂原包原装工业LCD液晶屏面板&#xff1b;具有高色域&#xff0c;显示动态视频、web及3D动画时&#xff0c;保障运动画面流…

麻溜启动Oracle实例demo

注意&#xff1a;镜像非常大并且外网网络过慢&#xff0c;可能得pull一天&#xff08;n次超时&#xff09;。。md后台静默pull命令&#xff1a; nohup docker pull container-registry.oracle.com/database/express:latest > pull.log 2>&1 & 启动实例&#xff1…