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

排序篇(一)----插入排序

1.直接插入排序

插入排序的思想:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

你可以想像成打牌一样,比如说斗地主,一张一张的摸牌,然后把手上的这些牌变成手续的排列.

具体步骤如下:

  1. 将第一个元素视为已排序的序列,将第二个元素与已排序序列进行比较,找到合适的位置插入。

  2. 将第三个元素与已排序序列进行比较,找到合适的位置插入。

  3. 以此类推,将后续的元素与已排序序列进行比较并插入。

  4. 最终得到一个完整的有序序列。

假设现在有一组数据需要排序:

初始序列:5 2 4 6 1 3

  1. 将第一个元素5视为已排序序列,不需要进行比较,直接插入。

已排序序列:5

未排序序列:2 4 6 1 3

  1. 将第二个元素2与已排序序列进行比较,找到合适的位置插入。

已排序序列:2 5

未排序序列:4 6 1 3

  1. 将第三个元素4与已排序序列进行比较,找到合适的位置插入。

已排序序列:2 4 5

未排序序列:6 1 3

  1. 将第四个元素6与已排序序列进行比较,找到合适的位置插入。

已排序序列:2 4 5 6

未排序序列:1 3

  1. 将第五个元素1与已排序序列进行比较,找到合适的位置插入。

已排序序列:1 2 4 5 6

未排序序列:3

  1. 将最后一个元素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;}
}
  1. 外部循环从第一个元素迭代到倒数第二个元素。

  2. 在每次迭代中,定义一个变量end,它的初始值为当前外部循环的索引i。

  3. 定义一个变量tmp,用于存储下一个待插入的元素,即a[end+1]。

  4. 在内部循环中,从end开始向前遍历数组,比较tmp与当前元素a[end]的大小。

  5. 如果tmp小于a[end],则将a[end]向后移动一位,即a[end+1] = a[end],并将end减1。

  6. 重复步骤4和步骤5,直到找到tmp应该插入的位置,即tmp大于等于a[end]。

  7. 将tmp插入到正确的位置,即a[end+1] = tmp。

  8. 重复步骤1到步骤7,直到所有元素都被排序。

2.希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:

先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

希尔排序的特性总结:

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

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就

会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

  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版本的希尔排序算法:

  1. 首先,初始化一个间隔值gap为数组的长度n。

  2. 在一个循环中,当间隔值大于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。

  3. 重复步骤2,直到间隔值gap为1,完成整个排序过程。

ShellSort2版本的希尔排序算法:

  1. 首先,初始化一个间隔值gap为数组的长度n。

  2. 在一个循环中,当间隔值大于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。

  3. 重复步骤2,直到间隔值gap为1,完成整个排序过程。

这两个版本的希尔排序算法的区别在于内部循环的起始位置不同,ShellSort1从j开始,每次以间隔值gap递增,而ShellSort2从0开始,每次以1递增。

相关文章:

排序篇(一)----插入排序

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

通俗讲解深度学习轻量网络MobileNet-v1/v2/v3

MobileNet网络是由google团队在2017年提出的&#xff0c;专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32)。MobileNet网络…...

mmpretrain学习笔记

深度学习模型的训练涉及几个方面 1、模型结构&#xff1a;模型有几层、每层多少通道数等 2、数据&#xff1a;数据集划分、数据文件路径、批大小、数据增强策略等 3、训练优化 &#xff1a;梯度下降算法、学习率参数、训练总轮次、学习率变化策略等 4、运行时&#xff1a;GPU、…...

rhel8 网络操作学习

一、查询dns服务器地址汇总 1.查询dns服务器地址&#xff1a; &#xff08;1&#xff09;方法一&#xff1a;执行命令 cat /etc/resolv.conf 执行结果如下&#xff1a; nameserver后面就是dns服务器的ip地址。 &#xff08;2&#xff09;方法2&#xff1a;查看/etc/syscon…...

有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表

用drf编写 1 有车型(CarModel)&#xff0c;车厂&#xff08;CarFactory&#xff09;&#xff0c;经销商(Distributor)三个表, 一个车厂可以生产多种车型&#xff0c;一个经销商可以出售多种车型&#xff0c;一个车型可以有多个经销商出售车型&#xff1a;车型名&#xff0c;车型…...

Python函数:chr()和ord()

两个函数是基于Unicode编码表进行进行字符与字码之间的转换。 chr()函数是通过字码转换成字符: 如图,坐标(1,4e10)丑 使用chr需要线将坐标相加得到&#xff1a;4e11 chr默认传入10进制的字码. 如图是各进制的字码。 也可以传入其他进制&#xff0c;不过需要在前面传入的参数最前…...

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 泛型编程

大家好&#xff0c;我是木川 泛型编程是一种编程范式&#xff0c;它允许编写具有参数化类型的代码&#xff0c;从而增加代码的复用性和灵活性。在泛型编程中&#xff0c;你可以编写一段代码&#xff0c;使其适用于不同类型的参数&#xff0c;而不需要为每种类型编写不同的实现。…...

脚手架开发流程详解

开发流程 创建npm项目创建脚手架入口文件&#xff0c;最上方添加 #!/usr/bin/env/ node配置package.json&#xff0c;添加bin属性编写脚手架代码将脚手架发布到npm 使用流程 安装脚手架 npm install -g your-own-cli使用脚手架 your-own-cli脚手架开发难点解析 分包&…...

架构真题2021(四十三)

产品配置是指一个产品在其生命周期各个阶段所产生的各种形式&#xff08;机器刻可读或人工可读&#xff09;和各种版本&#xff08;&#xff09;的集合。 需求规格说明、设计说明、测试报告需求规则说明、设计说明、计算机程序设计说明、用户手册、计算机程序文档、计算机程序…...

数据统计和分析怎么做?spss如何做好数据分析?

为什么要做数据分析?数据分析有什么意义&#xff1f;数据分析可以为企业和组织提供多方面的帮助&#xff0c;包括提高工作效率、优化业务流程、升职加薪、提高管理效率以及改进汇报效果等方面。 IBM SPSS Statistics 26是一款功能强大的统计分析软件&#xff0c;适用于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)

漏洞名称&#xff1a;Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞&#xff08;CVE-2019-5434&#xff09; English Name&#xff1a; Revive Adserver adxmlrpc.php Remote Code Execution Vulnerability (CVE-2019-5434) CVSS core: 9.0 影响资产数&a…...

Docker(三)、Dockerfile探究

Dockerfile探究 一、镜像层概念1、通过执行命令显化docker的机制 二、Dockerfile基础命令1、FROM 基于基准镜像【即构建镜像的时候&#xff0c;依托原有镜像做拓展】2、LABEL & MAINTAINER -说明信息3、WORKDIR 设置工作目录4、ADD & COPY 复制文件5、ENV 设置环境常量…...

C++读取文件夹下多个文件,包括图片等等

话不多说&#xff0c;直接上代码&#xff1a; int main() {//读入图片路径下的所有文件,D:\APP\VS\vs_projects_repos\Isp\imagesstring imgdirpath"D:\\APP\\VS\\vs_projects_repos\\Isp\\proimages\\";// 只读取文件夹下的png的文件名&#xff0c;也可以改成“*.b…...

DirectX 12 学习笔记 -结构

上篇文章我们创建了一个窗口&#xff0c;看样子还不难&#xff0c;我们继续玩DX12 引用一些文件 头文件 #include <d3d12.h> #include <dxgi1_4.h> #include <wrl.h>还有一些库 #pragma comment(lib, "d3d12.lib") #pragma comment(lib, "…...

【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本

lua 菜鸟教程&#xff1a;https://www.runoob.com/lua/lua-tutorial.html 在 Redis 使用 lua 脚本的好处&#xff1a; 减少网络开销。可以将多个请求通过脚本的形式一次发送&#xff0c;减少网络时延及开销原子性操作。Redis会将整个脚本作为一个整体执行&#xff0c;中间不会…...

标准/扩展库中对象的导入与使用

博主&#xff1a;命运之光 专栏&#xff1a;Python程序设计 Python扩展库导入和使用 Python启动时&#xff0c;仅加载了很少一部分模块&#xff0c;其它模块需要由程序员显示加载。使用“sys.modules.items()”显示所有预加载的模块信息。 import 模块名[.对象名] [as 别名] …...

87、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->List相关命令

本次讲解要点&#xff1a; List相关命令&#xff1a;是指value中的数据类型 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; 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 发送邮件需要进行…...

从理论到实践:在快马平台构建基于openclaw的物流分拣仿真系统

最近在研究物流自动化分拣系统时&#xff0c;发现openclaw机械爪控制在实际应用中存在不少痛点。传统开发流程需要从零搭建仿真环境、编写控制逻辑、调试物理交互&#xff0c;整个过程耗时耗力。于是尝试用InsCode(快马)平台快速构建了一个物流分拣仿真系统&#xff0c;效果出乎…...

FireRed-OCR保姆级教程:一键部署,精准提取表格公式转Markdown

FireRed-OCR保姆级教程&#xff1a;一键部署&#xff0c;精准提取表格公式转Markdown 1. 引言&#xff1a;为什么选择FireRed-OCR&#xff1f; 在日常工作和学习中&#xff0c;我们经常遇到需要从PDF、图片等文档中提取表格、公式等内容的情况。传统OCR工具往往难以准确识别复…...

DroidRun:用自然语言指令重塑Android自动化体验

1. 当Android遇上自然语言&#xff1a;DroidRun如何重新定义自动化 还记得第一次用语音助手控制手机时的惊艳吗&#xff1f;说句话就能定闹钟、发消息&#xff0c;感觉像在演科幻片。但很快你就会发现&#xff0c;这些功能就像快餐店的固定套餐——只能点菜单上有的&#xff0c…...

Pixel Mind Decoder 在游戏剧情分支中的应用:根据玩家情绪动态叙事

Pixel Mind Decoder 在游戏剧情分支中的应用&#xff1a;根据玩家情绪动态叙事 1. 引言&#xff1a;当游戏能读懂你的情绪 想象一下&#xff0c;当你正在玩一款角色扮演游戏&#xff0c;每次对话选择不仅影响剧情走向&#xff0c;游戏还能感知你的情绪变化——你犹豫时的焦虑…...

s2-pro效果展示:会议纪要转语音+重点语句强调式播报实录

s2-pro效果展示&#xff1a;会议纪要转语音重点语句强调式播报实录 1. 专业语音合成新体验 s2-pro作为Fish Audio开源的专业级语音合成模型镜像&#xff0c;正在重新定义文本转语音的标准。不同于常见的聊天式语音工具&#xff0c;它专注于提供高质量的语音合成服务&#xff…...

Science重磅指南:如何打造高影响力论文摘要?附Abstract写作黄金法则!

1. 科学论文摘要的黄金结构 写论文摘要就像给陌生人讲一个精彩的故事——要在短短200字内让人眼前一亮。我在Nature和Science上发过几篇论文&#xff0c;也审过上百篇投稿&#xff0c;发现顶级期刊的摘要其实有套"万能公式"。这个公式的核心是把摘要拆解成7个关键部分…...

经典位运算和计算各进制下的各位数字之和

(num & (num - 1)) 是检测2的幂的经典位运算方法&#xff0c;结果为0即为2的幂 if ((num & (num - 1)) ! 0) 按位与&#xff1a; 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 全 1 才 1&#xff0c;有 0 则 0 int lowbit(int x) { …...

DataGuard运维避坑指南:当备库遇到ORA-01578坏块时的完整恢复流程

DataGuard运维实战&#xff1a;备库ORA-01578坏块诊断与FROM SERVICE精准修复 凌晨三点&#xff0c;当告警短信突然亮起"ORA-01578: ORACLE data block corrupted"的红色提示时&#xff0c;作为DBA的你很清楚这意味着什么——这不仅是简单的坏块问题&#xff0c;更是…...

AI 大模型落地系列|Eino 组件核心篇:ChatTemplate 为什么不是字符串拼接

声明&#xff1a;本文数据源于官方文档与官方实现&#xff0c;重点参考 ChatTemplate 使用说明。 为什么很多人学 Eino 后&#xff0c;写 Prompt 时还是把 ChatTemplate 用成了字符串拼接&#xff1f;1. ChatTemplate 是什么&#xff0c;不是什么2. 接口虽短&#xff0c;但起的…...

清单来了:2026最新AI论文网站测评与推荐

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…...