希尔排序(C语言实现)
目录
1.希尔排序( 缩小增量排序 )
2.动图 编辑
3.代码实现
预排序实现
子序列排列实现
单趟排序实现
对整组数进行子排序
希尔排序代码
代码测试
时间复杂度分析
希尔排序的特性总结:

1.希尔排序( 缩小增量排序 )
基本思想:
1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并 对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重 复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
2.动图 
3.代码实现
思路:
预排序实现
插入排序
预排序实现
根据当前增量,数组被分为若干子序列,这些子序列的元素在原数组中间隔着固定的增量。对每个子序列应用插入排序。
假设最初增量为5

d越大,数据挪动得越快;d越小,数据挪动得越慢。前期让d较大,可以让数据更快得移动到自己对应的位置附近,减少挪动次数。
注:一般情况下,取序列的一半作为增量,然后依次减半,直到增量为1(也可自己设置)。
完成了一轮希尔排序,此时整个数组并不完全有序,但是已经比原始的数组更接近有序了。然后减小增量,通常是将原来的增量除以2(或者除以3+1),现在选择下一个增量为 2,按照此排序规则继续预排序即可,直到增量为1时,则为直接插入排序,此时则排序完成。
子序列排列实现
//子序列int gap;int end;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;
这里只需要在插入排序的基础上修改一下即可。end的所加所减都为gap;
单趟排序实现
int gap;//单趟排序实现for (int i = 0; i < n - gap; i += gap){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}
这里的 n-gap 和插入排序中的 n-1 一样是为了防止越界
对整组数进行子排序
int gap;for (int j = 0; j < gap; j++){//单趟排序实现for (int i = 0; i < n - gap; i += gap){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
外层循环
(for (int j = 0; j < gap; j++))意在对每个以gap为间隔的分组进行遍历。
这里进行一下优化:
三层代码的循环是每一组子排序排完再进行下一组,直到排完整个数组。
下面这组代码优化后效率并没有很大的提升,只是代码更为简洁。
这组代码是齐头并进,排完第一组的前n个就排下一组了,并没有把第一组全部排完。
int gap;for (int i = 0; i < n - gap; i++){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}
希尔排序代码
分析
gap越大,大的值更快调到后面,小的值更快调到前面,越不接近有序。
gap越小,大的值更慢调到后面,小的值更慢调到前面,越接近有序。
当gap为1,就是直接插入排序。
所以我们这里的gap值应该是在变化的,一般我们随n变化,取gap = gap/3+1,或者gap = gap/2;
void ShellSort(int* a,int n)
{int gap = n;while (gap>1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
这里无论gap是奇数还是偶数,这里gap最终都会除以到值为1。
gap>1时是预排序,目的让其接近有序。
gap=1时是直接插入排序,目的让其有序。
在gap=1时,已经十分接近有序了
代码测试

时间复杂度分析
希尔排序的时间复杂度并不固定,它依赖于所选择的间隔序列(增量序列)。直到今天,已经有多种不同的间隔序列被提出来,每种都有自己的性能特点。
《数据结构(C语言版)》--- 严蔚敏

《数据结构-用面相对象方法与C++描述》--- 殷人昆
因为咋们的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按照:O(N^1.25) 到 O(1.6* N^1.25) 来算。
希尔排序的特性总结:
时间复杂度:O(N²)
空间复杂度:O(1)
稳定性:不稳定
复杂性:简单
如有错误,请指正
相关文章:
希尔排序(C语言实现)
目录 1.希尔排序( 缩小增量排序 ) 2.动图 编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结: 1.希尔排序( 缩小增量排序 ) 基本思想: 1.先选定一个…...
LLVM 中的Value、User、Use设计
概述 LLVM是一个强大的编译器基础设施,提供了一套丰富的库,用于构建编译器的前端和后端。在LLVM中,Value、User和Use是几个核心的概念,它们之间有着紧密的关系 Value Value是LLVM中表示所有可计算的值的基类,例如常…...
C++智能指针入门教程(C++11)
智能指针 1.定义 C中的智能指针是一种用于自动管理动态分配的内存的模板类,它们通过封装原始指针来提供自动的内存管理功能,从而避免了内存泄漏和悬挂指针等问题。C标准库中提供了几种智能指针类型,其中最常用的是std::unique_ptr、std:…...
常用工具推荐!分享7款AI论文修改软件工具网站
在当今学术研究和写作领域,AI论文修改软件工具已经成为了不可或缺的助手。这些工具不仅能够帮助研究人员提高写作效率,还能确保论文的质量和原创性。以下是七款值得推荐的AI论文修改软件工具网站,其中特别推荐千笔-AIPassPaper。 1. 千笔-AI…...
怎么解除BitLocker对磁盘的加密?
BitLocker是一种Windows操作系统内置的加密功能,用于保护用户的数据安全。它通过对整个磁盘进行加密,防止数据被未经授权的用户访问。BitLocker主要用于保护笔记本电脑和台式机中的重要数据,尤其是在设备丢失或被盗的情况下。怎么解除BitLock…...
群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档
文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景:如果遇到周末紧急需要改方案,但团队成员都在各自家中,这个时候如果大家能够轻松访问这个…...
Unity3d 以鼠标位置点为中心缩放视角(正交模式下)
思路整理: 缩放前: 缩放后: 记录缩放前鼠标的屏幕坐标 A,计算鼠标位置对应的世界坐标 A_world 缩放完成后,根据当前屏幕下A所对应的世界坐标A1_world 计算A1_world 和 A_world 的偏移量 移动摄像机 代码ÿ…...
Git清除某文件所有历史提交记录
一、软件要求 1.1 软件版本要求 git > 2.22.0python3 > 3.5 1.2 辅助插件 git filter-repo Linux/macOS # Debian/Ubuntu 系统 # 或使用 pip 安装pip install git-filter-repo sudo apt install git-filter-repo Windows pip install git-filter-repo二、操作步骤…...
jacoco生成单元测试覆盖率报告
前言 单元测试是日常编写代码中常用的,用于测试业务逻辑的一种方式,单元测试的覆盖率可以用来衡量我们的业务代码经过测试覆盖的比例。 目前市场上开源的单元测试覆盖率的java插件,主要有Emma,Cobertura,Jacoco。具体…...
【CSS Tricks】如何做一个粒子效果的logo
效果展示 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果Logo</title>…...
如何使用ssm实现基于Javaweb的网上花店系统的设计与实现
TOC ssm653基于Javaweb的网上花店系统的设计与实现jsp 研究背景 自计算机发展以来给人们的生活带来了改变。第一代计算机为1946年美国设计,最开始用于复杂的科学计算,占地面积、开机时间要求都非常高,经过数十几的改变计算机技术才发展到今…...
Elastic 的 OpenTelemetry PHP 发行版简介
作者:Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…...
TCP 和 UDP 协议的区别?
参考TCP 和 UDP的区别_tcp和udp的区别-CSDN博客...
【PHP】使用thinkphp5查询最大值时,把varchar类型字段转换成数字
有时候我们需要把carchar类型的字段进行聚合函数运运行(max、min、avg),但是如果直接用聚合函数,得到的结果是错误的,因为varchar字段是字符串,无法直接使用聚合函数,所以需要把varchar字段转换…...
Java 正则表达式详解
正则表达式 (Regular Expression,简称 regex) 是一种强大的文本处理工具,可以用来匹配、搜索和替换文本中的特定模式。在 Java 中,正则表达式由 java.util.regex 包提供支持。 1. 理解正则表达式语法 正则表达式使用特殊的字符和符号来定义…...
MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)
目录 讲解一:窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数:求和 min函数 :最小值 1.2. 排序函数 1.3. 跨行函数…...
Jira Cloud涨价5%-20%,钉钉项目Teambition成优选替代
近日,Jira再次宣布涨价,Cloud版涨幅达到5%-20%,这一消息来源于Atlassian官方面向合作伙伴发布的2024年最新涨价通知。 Atlassian旗下核心产品,包括Jira、Confluence、JiraServiceManagement等的Cloud版本价格将有所提高ÿ…...
Python语言基础教程(下)4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
【HTTP】构造HTTP请求和状态码
状态码 用于响应中,表示响应的结果如何 正确?错误?什么原因? HTTP 中的状态码都是标准约定好的 200 OK 成功了,一切顺利 在抓包到的响应中 404 Not Found 访问的资源(URL 中的路径)没找…...
Delta Lake如何使用
1. 安装 Java 确保你的系统上安装了 Java 8 或更高版本。可以通过以下命令检查 Java 是否已安装: java -version2. 安装 Apache Spark 下载 Spark: 从 Apache Spark 官方网站 下载适合的版本,建议下载预编译的版本(例如…...
Pixel Aurora Engine应用场景:独立开发者低成本构建像素IP资产库
Pixel Aurora Engine应用场景:独立开发者低成本构建像素IP资产库 1. 像素艺术创作新纪元 在游戏开发领域,像素艺术始终保持着独特的魅力。从早期的《超级马里奥》到现代的《星露谷物语》,像素风格游戏凭借其怀旧感和艺术表现力,…...
Kotlin 2.4.0 正式发布,快来看看有哪些更新
昨日,JetBrains 发布了 Kotlin 2.4.0-Beta1。 如果你管的是 Android 工具链、Kotlin 多平台,或者团队里已经开始碰 context receivers、注解处理、.klib 兼容问题,这个版本已经值得单独开分支验证。 先说结论 这次最有分量的变化࿰…...
芯片缺货潮下的应对策略与国产替代方案
1. 芯片缺货潮下的行业现状最近我的一个产品项目中,原本采购价仅5元的ST品牌MCU(微控制器)价格飙升至70元,涨幅高达14倍。这个案例并非个例,而是当前全球半导体行业供应链危机的缩影。作为从业十余年的硬件工程师&…...
Ant Design X:AI赋能前端开发的革命性工具
1. Ant Design X:当设计系统遇上AI会发生什么? 第一次听说Ant Design X时,我正在为一个电商项目焦头烂额地调试聊天机器人组件。传统方案需要自己对接NLP服务、处理对话状态、设计交互逻辑...直到同事扔给我一个链接:"试试这…...
当相机位姿已知:利用COLMAP从稀疏到稠密重建的实战指南
1. 环境准备与数据格式转换 在开始COLMAP重建之前,我们需要确保环境配置正确,并完成相机位姿数据的格式转换。COLMAP支持Windows、Linux和macOS系统,但为了获得最佳性能,建议使用配备NVIDIA显卡的机器,并安装CUDA加速版…...
ESP32-S3实战指南:SPI多设备管理与高效数据传输
1. ESP32-S3的SPI总线基础认知 第一次接触ESP32-S3的SPI总线时,我完全被各种专业术语搞懵了。后来在实际项目中反复折腾才发现,SPI本质上就是个"快递小哥",负责在芯片和外围设备之间搬运数据。ESP32-S3内置了4个这样的"快递站…...
别再看水刊了!智能故障诊断领域投稿,这20+个SCI期刊才是你的目标(附避坑指南)
智能故障诊断领域投稿指南:20高价值SCI期刊与避坑策略 对于从事智能故障诊断研究的学者而言,选择合适的SCI期刊投稿是研究成果获得认可的关键一步。本文将系统梳理该领域的优质期刊资源,帮助您避开常见陷阱,提高投稿成功率。 1. 智…...
从芯片设计到产线测试:深入浅出聊聊DFT中的SCAN链设计与JTAG标准(含IEEE 1149.1)
从芯片设计到产线测试:深入浅出聊聊DFT中的SCAN链设计与JTAG标准(含IEEE 1149.1) 在芯片设计领域,可测试性设计(DFT)早已从"锦上添花"变成了"不可或缺"的核心环节。想象一下࿰…...
在线PPT工具哪个最方便快捷?6款主流工具实测,新手也能快速出片
作为AI博主,日常要产出AI工具实测、智能创作干货、高效办公教程,对在线PPT工具的核心需求远超基础编辑——全端适配、AI生成专业、安全合规、资源充足,无需复杂操作,既能依托AI快速生成高质量内容,又能兼顾多场景使用与…...
BP算法在SAR成像中的高效实现与优化策略
1. BP算法在SAR成像中的核心原理 BP(Back Projection)算法是合成孔径雷达(SAR)成像中最直观的时域处理方法。我第一次接触这个算法时,就被它那种"暴力美学"式的计算逻辑震撼到了——它不需要任何傅里叶变换的…...
