排序篇(一)----插入排序
1.直接插入排序
插入排序的思想:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
你可以想像成打牌一样,比如说斗地主,一张一张的摸牌,然后把手上的这些牌变成手续的排列.

具体步骤如下:
-
将第一个元素视为已排序的序列,将第二个元素与已排序序列进行比较,找到合适的位置插入。
-
将第三个元素与已排序序列进行比较,找到合适的位置插入。
-
以此类推,将后续的元素与已排序序列进行比较并插入。
-
最终得到一个完整的有序序列。
假设现在有一组数据需要排序:
初始序列:5 2 4 6 1 3
-
将第一个元素5视为已排序序列,不需要进行比较,直接插入。
已排序序列:5
未排序序列:2 4 6 1 3
-
将第二个元素2与已排序序列进行比较,找到合适的位置插入。
已排序序列:2 5
未排序序列:4 6 1 3
-
将第三个元素4与已排序序列进行比较,找到合适的位置插入。
已排序序列:2 4 5
未排序序列:6 1 3
-
将第四个元素6与已排序序列进行比较,找到合适的位置插入。
已排序序列:2 4 5 6
未排序序列:1 3
-
将第五个元素1与已排序序列进行比较,找到合适的位置插入。
已排序序列:1 2 4 5 6
未排序序列:3
-
将最后一个元素3与已排序序列进行比较,找到合适的位置插入。
已排序序列:1 2 3 4 5 6
未排序序列:空
最终得到有序序列:1 2 3 4 5 6
int arr[] = { 5, 2, 4, 6, 1, 3};
InsertSort(arr, sizeof(arr) / sizeof(arr[0]));
//直接插入排序
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}
-
外部循环从第一个元素迭代到倒数第二个元素。
-
在每次迭代中,定义一个变量end,它的初始值为当前外部循环的索引i。
-
定义一个变量tmp,用于存储下一个待插入的元素,即a[end+1]。
-
在内部循环中,从end开始向前遍历数组,比较tmp与当前元素a[end]的大小。
-
如果tmp小于a[end],则将a[end]向后移动一位,即a[end+1] = a[end],并将end减1。
-
重复步骤4和步骤5,直到找到tmp应该插入的位置,即tmp大于等于a[end]。
-
将tmp插入到正确的位置,即a[end+1] = tmp。
-
重复步骤1到步骤7,直到所有元素都被排序。
2.希尔排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:
先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

希尔排序的特性总结:
-
希尔排序是对直接插入排序的优化。
-
当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就
会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
-
希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的
4.希尔排序的时间复杂度都不固定:


我们这里的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按 照: O(N^1.3)来算.
简而言之希尔排序就是在上面的直接插入排序上加入了预排序,巧妙的就是当gap为1的时候,其实走的就是直接插入排序,可以说希尔排序是直接插入排序的升级版本.
//希尔排序(便于理解版)
void ShellSort1(int* a, int n)
{int gap = n;while (gap > 1){//gap /= 2;gap = gap / 3 + 1;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){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;}}}
}
//希尔排序(少一层循环版)
void ShellSort2(int* a, int n)
{int gap = n;while (gap > 1){//gap /= 2;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;}elsebreak;}a[end + gap] = tmp;}}
}
代码详解:
ShellSort1版本的希尔排序算法:
-
首先,初始化一个间隔值gap为数组的长度n。
-
在一个循环中,当间隔值大于1时,执行以下操作: a. 将间隔值gap除以3并加1,得到新的间隔值gap。 b. 在一个嵌套循环中,从0到gap-1,对每个间隔进行插入排序:
-
从当前间隔值的位置开始,向后遍历数组,每次以间隔值gap递增。
-
对于每个位置i,将其作为插入排序的起始位置,将a[i+gap]作为待插入的元素tmp。
-
在内部循环中,从当前位置向前遍历,比较tmp与当前元素a[end]的大小。
-
如果tmp小于a[end],则将a[end+gap]的值更新为a[end],并将end减去间隔值gap。
-
如果tmp大于等于a[end],则跳出内部循环。
-
将tmp插入到正确的位置,即a[end+gap] = tmp。
-
-
重复步骤2,直到间隔值gap为1,完成整个排序过程。
ShellSort2版本的希尔排序算法:
-
首先,初始化一个间隔值gap为数组的长度n。
-
在一个循环中,当间隔值大于1时,执行以下操作: a. 将间隔值gap除以3并加1,得到新的间隔值gap。 b. 在一个嵌套循环中,从0到n-gap-1,对每个间隔进行插入排序:
-
从当前位置i开始,将其作为插入排序的起始位置,将a[i+gap]作为待插入的元素tmp。
-
在内部循环中,从当前位置向前遍历,比较tmp与当前元素a[end]的大小。
-
如果tmp小于a[end],则将a[end+gap]的值更新为a[end],并将end减去间隔值gap。
-
如果tmp大于等于a[end],则跳出内部循环。
-
将tmp插入到正确的位置,即a[end+gap] = tmp。
-
-
重复步骤2,直到间隔值gap为1,完成整个排序过程。
这两个版本的希尔排序算法的区别在于内部循环的起始位置不同,ShellSort1从j开始,每次以间隔值gap递增,而ShellSort2从0开始,每次以1递增。
相关文章:
排序篇(一)----插入排序
1.直接插入排序 插入排序的思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 你可以想像成打牌一样,比如说斗地主,一张一张的摸牌,然后把手上的这些牌变成手续的排列.…...
通俗讲解深度学习轻量网络MobileNet-v1/v2/v3
MobileNet网络是由google团队在2017年提出的,专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络,在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%,但模型参数只有VGG的1/32)。MobileNet网络…...
mmpretrain学习笔记
深度学习模型的训练涉及几个方面 1、模型结构:模型有几层、每层多少通道数等 2、数据:数据集划分、数据文件路径、批大小、数据增强策略等 3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等 4、运行时:GPU、…...
rhel8 网络操作学习
一、查询dns服务器地址汇总 1.查询dns服务器地址: (1)方法一:执行命令 cat /etc/resolv.conf 执行结果如下: nameserver后面就是dns服务器的ip地址。 (2)方法2:查看/etc/syscon…...
有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表
用drf编写 1 有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表, 一个车厂可以生产多种车型,一个经销商可以出售多种车型,一个车型可以有多个经销商出售车型:车型名,车型…...
Python函数:chr()和ord()
两个函数是基于Unicode编码表进行进行字符与字码之间的转换。 chr()函数是通过字码转换成字符: 如图,坐标(1,4e10)丑 使用chr需要线将坐标相加得到:4e11 chr默认传入10进制的字码. 如图是各进制的字码。 也可以传入其他进制,不过需要在前面传入的参数最前…...
flink sql 使用
1.准备工作 安装flink 1.16.2 将以下jar包放到/data/cmpt/flink-1.16.2/lib 目录下 antlr-runtime-3.5.2.jar flink-connector-hive_2.12-1.16.2.jar flink-connector-jdbc-1.16.2.jar mysql-connector-java-6.0.6.jar hive-exec-3.1.3.jar libfb303-0.9.3.ja…...
面试官:谈谈 Go 泛型编程
大家好,我是木川 泛型编程是一种编程范式,它允许编写具有参数化类型的代码,从而增加代码的复用性和灵活性。在泛型编程中,你可以编写一段代码,使其适用于不同类型的参数,而不需要为每种类型编写不同的实现。…...
脚手架开发流程详解
开发流程 创建npm项目创建脚手架入口文件,最上方添加 #!/usr/bin/env/ node配置package.json,添加bin属性编写脚手架代码将脚手架发布到npm 使用流程 安装脚手架 npm install -g your-own-cli使用脚手架 your-own-cli脚手架开发难点解析 分包&…...
架构真题2021(四十三)
产品配置是指一个产品在其生命周期各个阶段所产生的各种形式(机器刻可读或人工可读)和各种版本()的集合。 需求规格说明、设计说明、测试报告需求规则说明、设计说明、计算机程序设计说明、用户手册、计算机程序文档、计算机程序…...
数据统计和分析怎么做?spss如何做好数据分析?
为什么要做数据分析?数据分析有什么意义?数据分析可以为企业和组织提供多方面的帮助,包括提高工作效率、优化业务流程、升职加薪、提高管理效率以及改进汇报效果等方面。 IBM SPSS Statistics 26是一款功能强大的统计分析软件,适用于Mac操作…...
【多线程】线程安全的集合类
文章目录 1. 多线程环境使用ArrayList1.1 自己使用同步机制1.2 Collections.synchronizedList(new ArrayList);1.3 使用 CopyOnWriteArrayList 2. 多线程使用队列3. 多线程环境使用哈希表3.1 HashTable3.2 ConcurrentHashMap3.3 Hashtable和HashMap、ConcurrentHashMap 之间的区…...
Goby 漏洞发布|Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞(CVE-2019-5434)
漏洞名称:Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞(CVE-2019-5434) English Name: Revive Adserver adxmlrpc.php Remote Code Execution Vulnerability (CVE-2019-5434) CVSS core: 9.0 影响资产数&a…...
Docker(三)、Dockerfile探究
Dockerfile探究 一、镜像层概念1、通过执行命令显化docker的机制 二、Dockerfile基础命令1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】2、LABEL & MAINTAINER -说明信息3、WORKDIR 设置工作目录4、ADD & COPY 复制文件5、ENV 设置环境常量…...
C++读取文件夹下多个文件,包括图片等等
话不多说,直接上代码: int main() {//读入图片路径下的所有文件,D:\APP\VS\vs_projects_repos\Isp\imagesstring imgdirpath"D:\\APP\\VS\\vs_projects_repos\\Isp\\proimages\\";// 只读取文件夹下的png的文件名,也可以改成“*.b…...
DirectX 12 学习笔记 -结构
上篇文章我们创建了一个窗口,看样子还不难,我们继续玩DX12 引用一些文件 头文件 #include <d3d12.h> #include <dxgi1_4.h> #include <wrl.h>还有一些库 #pragma comment(lib, "d3d12.lib") #pragma comment(lib, "…...
【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本
lua 菜鸟教程:https://www.runoob.com/lua/lua-tutorial.html 在 Redis 使用 lua 脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延及开销原子性操作。Redis会将整个脚本作为一个整体执行,中间不会…...
标准/扩展库中对象的导入与使用
博主:命运之光 专栏:Python程序设计 Python扩展库导入和使用 Python启动时,仅加载了很少一部分模块,其它模块需要由程序员显示加载。使用“sys.modules.items()”显示所有预加载的模块信息。 import 模块名[.对象名] [as 别名] …...
87、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->List相关命令
本次讲解要点: List相关命令:是指value中的数据类型 启动redis服务器: 打开小黑窗: C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redi…...
Celery结合flask完成异步任务与定时任务
Celery 常用于 web 异步任务、定时任务等。 使用 redis 作为 Celery的「消息代理 / 消息中间件」。 这里通过Flask-Mail使用qq邮箱延时发送邮件作为示例 pip install celery pip install redis pip install Flask-Mail1、使用flask发送邮件 使用 Flask-Mail 发送邮件需要进行…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...
Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
SpringCloud优势
目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...
