C语言数据结构(11)——归并排序

欢迎来到博主的专栏C语言数据结构
博主ID:代码小豪

文章目录

    • 归并排序
      • 两个有序数组的合并
      • 归并排序
    • 归并排序的代码

归并排序

两个有序数组的合并

当前有两个有序数组arr1和arr2,我们创建一个可以容纳arr1和arr2同等元素个数的新数组arr。
在这里插入图片描述

让一个指针指向arr1的队首,一个指针指向arr2的队首,还有一个指针指向arr的队首。依次对比两个数组之间的值的大小,将数据较小的值放入arr中,再将对应的指针指向下一个元素。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时arr2已经遍历完了,将arr1的剩余数据全部拷贝到arr中。
在这里插入图片描述
在这里插入图片描述
可以发现,这种方法将有序数组合并之后任然是一个有序的数组,这是否说明,我们可以利用数组合并的方式实现一种排序算法呢?

在这里插入图片描述
这是一个无序数组arr,但是将这个数组分为两半。
在这里插入图片描述
就可以将两部分合并成一个有序的数组。

但是绝大多数的无序数组都无法找到这个分界线,所以想要利用合并有序数组完成排序,就需要先将整体的数组分为两部分,其中一部分是有序数组,另外一部分也是有序数组,然后再将这两个有序数组合并,完成排序。

当数组中的元素个数越来越多,那么出现两个有序数组的概率就会越来越小,这是显而易见的现象,那么如果反过来想呢?若是数组中的数据只有两个,那么出现两个有序数组的概率是百分之百。
在这里插入图片描述
如果现在有四个元素组成的数组,那么由此法拆解后的子数组为:
在这里插入图片描述
为什么要将一个数组分成N个大小为1的子序列呢?

可以发现,这些子序列都是有序的,那么将这些子序列进行有序合并,合并后的序列也就是有序的序列了。

相信大家再学高数的极限的时候都看过这么一句话:

一尺之捶,日取其半,万世不竭

意思就是将一个木棒,每天截取他的一半,永远都截不完。

当然数组是不会取不完的,如果将一个数组一直分成两半,最后就会得到一个元素组成的子序列。
在这里插入图片描述

现在有N个元素为1的子序列,将两两相邻的子序列合并成有序序列。直到所有子序列构成一个数组为止

例如:
在这里插入图片描述

归并排序

将前3个操作联系起来就能实现归并排序。

归并排序的定义如下:

设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的子序列,再两两合并……如此重复,直到得到一个长度为n的有序序列为止

归并排序的步骤如下:
(1)将整个数组二分递归,直到不可分为止(单数据序列)
(2)由递归堆栈开始合并有序序列,最后将合并完成的数组拷贝到原数组。

这里讲讲合并数组时的递归堆栈,先通过递归将整个数组拆分。
在这里插入图片描述
这个分解的方式与二叉树一致。完成分解之后就是将序列合并了。在调用堆栈的作用下,会将每个递归函数由下开始回溯。

在这里插入图片描述

归并排序的代码

void _MergeSort(int* a, int begin, int end,int* tmp)
{int mid = (begin + end) / 2;if (begin >= end)//不可再分,返回递归{return;}_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid+1, end, tmp);int i = begin;//合并数组int begin1 = begin;//将原数组分为两部分,一部分是(begin,mid),另一部分是(mid+1,end)int end1 = mid;int begin2 = mid + 1;int end2 = end;while (begin1 <= end1 && begin2 <= end2)//合并有序数组{if (a[begin1] <= a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}while (begin1 <= end1)//将剩余数据拷贝到临时数组{tmp[i++] = a[begin1++];}while (begin2 <= end2)//将剩余数据拷贝至临时数组{tmp[i++] = a[begin2++];}memmove(a+begin, tmp+begin, sizeof(int) * (end-begin + 1));//将合并的数组拷贝到原数组
}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);//创建一个相等元素个数的数组、_MergeSort(a, 0, n - 1, tmp);free(tmp);
}

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

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

相关文章

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

js中使let关键字报错,改用var关键字解决

js中使let关键字报错,改用var关键字解决 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;总结 项目场景&#xff1a; 使用 let 关键字报错&#xff0c;报错信息为&#xff1a; Uncaught ReferenceError: maxNum is not defined at getMaxNum (4-3.htm…

Open-GroundingDino和GroundingDino的推理流程实现

1、简单介绍 GroundingDino是一个多模态检测模型&#xff0c;可以输入文本提示输出视觉目标的位置&#xff0c;实现了文本和图像的匹配。相比较于一众的OVD算法&#xff0c;GroundingDino在文本处理上的灵活度高&#xff0c;因为大多OVD算法是采用clip文本编码器&#xff0c;这…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

7(8)-2-CSS 盒子模型

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 盒子模型1 盒子模型&#xff08;Box Model&#xff09;组成2 边框&#x…

软考程序员2024年5月报名流程及注意事项

2024年5月软考程序员报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的考友可以…

多线程4

死锁 想获取到第二把锁&#xff0c;就需要执行完第一层大括号&#xff0c;想要执行完第一层大括号&#xff0c;就要先获取到第二层的锁。 synchronized (counter2){ synchronized (counter2){} } 例子:t2先启动&#xff0c;t2进行加锁后一定成功&#xff0c;但是如果t2进行二…

图数据库技术:知识图谱的存储与查询

图数据库技术&#xff1a;知识图谱的存储与查询 一、引言 在探索知识的宇宙中&#xff0c;知识图谱是组织和理解海量信息的星系图。在这张图中&#xff0c;每一个概念、实体与事物不再是孤立的点&#xff0c;而是通过关系与边相互连接&#xff0c;形成一个复杂而有机的网络。图…

计算机网络练习-计算机网络概述与性能指标

计算机网络概述 ----------------------------------------------------------------------------------------------------------------------------- 1. 计算机网络最据本的功能的是( )。 1,差错控制 Ⅱ.路由选择 Ⅲ,分布式处理 IV.传输控制 …

3.网络编程-TCP

目录 TCP 建立连接的过程是怎样的 TCP为什么是三次握手 TCP 断开连接的过程是怎样的 TCP挥手为什么需要四次 为什么TIME_WAIT等待的时间是2MSL TCP详解之滑动窗口 TCP 半连接队列和全连接队列是什么 TCP粘包&#xff0c;拆包是怎么发生的&#xff0c;如何解决 TCP是如何…

书生·浦语大模型实战营之茴香豆:搭建你的 RAG 智能助理

书生浦语大模型实战营之茴香豆&#xff1a;搭建你的 RAG 智能助理 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇…

高项-进度管理

成本管理就是要确保项目在批准的预算内完成。 成本的类型 成本的组成 项目成本管理储备成本基准&#xff08;需要经过批准才能进行变更&#xff09; 成本基准应急储备工作包成本&#xff08;在基准内的可以不经过批准变更&#xff09; 工作包成本活动成本活动应急储备&…

物联网实战--驱动篇之(三)LoRa(sx1278)

目录 一、LoRa简介 二、sx1278模块 三、硬件抽象层 四、SX1278初始化 五、发送时间计算 六、发送模式 七、接收模式 八、总结 一、LoRa简介 LoRa在物联网传输领域有着举足轻重的地位&#xff0c;平时大家可能比较少听说&#xff0c;因为它主要还是在行业应用&#xff0…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算&#xff0c;整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&am…

鸿蒙内核源码分析 (Fork 篇) | 一次调用,两次返回

第一次看到 fork 时&#xff0c;说是一次调用&#xff0c;两次返回&#xff0c;当时就懵圈了&#xff0c;多新鲜&#xff0c;真的很难理解。因为这足以颠覆了以往对函数的认知&#xff0c; 函数调用还能这么玩&#xff0c;父进程调用一次&#xff0c;父子进程各返回一次。而且只…

记Postman参数化

因为需要在WEB页面上处理部分数据&#xff0c;手动操作太慢&#xff0c;所以考虑使用接口方式处理&#xff0c;因急于使用&#xff0c;用Python Request的方式&#xff0c;写代码也来得慢&#xff0c;故采用Postman加外部文件参数化方式来实现。 接口请求是Post方式&#xff0c…

电商平台混战之下,天猫破解品牌增长奥秘

行业共识是追上风&#xff0c;才有好生意&#xff0c;但风很多时候不会只有一个方向。 4月2日&#xff0c;上海&#xff0c;TopTalk 2024天猫超级品牌私享会举行。这个活动已举办数年&#xff0c;每一年天猫都会发布新一年度的品牌经营策略&#xff0c;只是与往年不同的是&…

YOLOv9改进策略 :原创自研 | 自研MSAM注意力,通道注意力升级,魔改CBAM

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 改进1结构图如下: 《YOLOv…

linux安全加固

1.登录账号加固 /etc/login.defs 创建⽤户的默认设置⽂件 grep -Ev "^#|^$" /etc/login.defs /etc/login.defs ⽂件⽤于在创建⽤户时&#xff0c;对⽤户的⼀些基本属性做默认设置&#xff0c;例如指定⽤户 UID 和 GID 的范围&#xff0c;⽤户的过期时间&#xff0…

寻找排序数组中的最小值

题目描述 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若旋转 7 次…