news 2026/4/15 23:02:47

排序算法-归并排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
排序算法-归并排序

在学习归并排序之前,个人认为需要掌握双指针的相关知识(快慢指针,左右指针之类的)。

归并排序是一种运用快慢指针与递归来实现的算法

思路

拆分过程-“归”的过程

对于数组:

5 4 3 2 1

我们先把其分为两部分:

5 4 和 3 2 1 //两个都可以,看你选择

5 4 3 和 2 1 //两个都可以,看你选择

然后再对于左右两部分再次拆分,直到分成一个元素

而这个过程,我们可以运用递归来进行数组的拆分

f(0 , 4)->f(0 , 2) + f(3 , 4)->f(0 , 1) + f(2 , 2) + f(3 , 3) + f(4, 4) //返回的是边界下标

而我们就可以利用这个过程将大数组转换成小数组,最终得到一个有序的数组

排序过程-“并”的过程

我们取递归返回的其中一个过程为例:

3 4 5 和 1 2

我们定义一个临时变量来存储部分排序好的元素,假设这个变量为temp

我们先比较 3 和 1,发现 1 比较小

于是我们把 1 放入temp

继续比较 3 和 2 , 发现 2 比较小

于是我们把 2 放入temp

这个时候右数组到头了,于是我们停止比较,并且把左数组剩下的元素全放到temp里面去

于是我们得到的temp就是

1 2 3 4 5

然后我们将temp赋值给原数组,把原数组覆盖掉

我们明显可以发现,和原来相比较,原数组更加有序了(已经有序了,我们取的是排序的最后一步)

代码实现

#include<iostream> using namespace std; const int N = 1e5; int arr[N]; int temp[N]; //辅助数组 void merge_sort(int l , int r){ //递归实现归并排序 if(l >= r) return; //只有一个元素或者没有,自然有序,不用管 int m = (l + r) / 2; //这里就是把数组拆开 merge_sort(l , m); //处理左边 merge_sort(m + 1 , r); //处理右边 int i = l , j = m + 1 , k = 0; //i和j分别代表左右数组的左边界起点 k是临时变量,作为temp数组的边界 while(i <= m && j <= r){ if(arr[i] > arr[j]){ temp[k] = arr[j]; //把小的数放进来 k++; j++; }else{ temp[k++] = arr[i++]; } } //接下来判断i和j哪个没走完,把剩下的元素放进去 while(i <= m) temp[k++] = arr[i++]; while(j <= r) temp[k++] = arr[j++]; //然后把temp覆盖arr,即把temp重新赋值给arr,arr的起始位置是l和r,temp的起始位置是0 for(i = l , k = 0 ; i <= r ; i++ , k++){ arr[i] = temp[k]; } } int main(){ int n; cin >> n; for(int i = 0 ; i < n ; i++){ cin >> arr[i]; } merge_sort(0 , n - 1); //将左边界和右边界传入 for(int i = 0 ; i < n ; i++){ cout << arr[i] << ' '; } cout << endl; return 0; }

总结

归并排序的整体难度起始不大,然后复杂度和稳定性这两个方面的话,我不清楚这个复杂度是怎么算出来的,但是我查出来是O()。归并排序不是一个稳定的算法,因为临时数组会反复地把原数组进行覆盖。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:17:04

Langchain-Chatchat问答准确率提升的关键配置参数

Langchain-Chatchat问答准确率提升的关键配置参数 在企业知识管理日益智能化的今天&#xff0c;一个常见却棘手的问题浮出水面&#xff1a;如何让大语言模型真正“懂”你的公司文档&#xff1f;许多团队尝试部署本地问答系统时发现&#xff0c;模型明明读了上百页制度文件&…

作者头像 李华
网站建设 2026/4/9 11:40:11

Langchain-Chatchat问答系统灰度期间知识库版本回退

Langchain-Chatchat问答系统灰度期间知识库版本回退 在企业智能服务逐步落地的过程中&#xff0c;一个常见的挑战浮现出来&#xff1a;当我们在灰度环境中更新了知识库后&#xff0c;用户反馈却开始增多——原本准确的回答变得模糊甚至错误。这种“上线即出错”的窘境&#xff…

作者头像 李华
网站建设 2026/4/11 0:10:03

契约测试:破解微服务集成测试困境的利器

1 微服务集成的现实挑战 在微服务架构成为主流的今天&#xff0c;软件测试从业者面临着前所未有的集成测试复杂性。每个微服务独立开发、部署和演进&#xff0c;这种自治性在带来灵活性的同时&#xff0c;也制造了棘手的集成问题&#xff1a; 测试环境脆弱性&#xff1a;传统的…

作者头像 李华
网站建设 2026/4/1 3:31:08

Perf测试翻车现场:说说我的“压压测”辛酸史

作为一名软件测试工程师&#xff0c;性能测试&#xff08;Perf Test&#xff09;本应是保障系统稳定性的“守门员”&#xff0c;但在我的职业生涯中&#xff0c;它更像是一场场惊心动魄的“事故现场回放”。今天&#xff0c;我想和大家分享几个真实的压测翻车案例&#xff0c;希…

作者头像 李华
网站建设 2026/4/15 8:05:07

【实战】GEO 搜索优化系统源码搭建与 iOS 端发布功能开发全攻略

在本地生活、外卖、出行、社交等 APP 场景中&#xff0c;GEO&#xff08;地理信息&#xff09;搜索是核心功能之一 —— 用户通过定位获取附近的商户、活动、好友等信息&#xff0c;其体验直接取决于 GEO 搜索的性能和准确性。传统的数据库经纬度模糊查询存在效率低、结果偏差大…

作者头像 李华
网站建设 2026/4/10 6:58:03

Wayve最近的GAIA-3分享:全面扩展世界模型的评测能力......

作者 | Feynman 编辑 | 自动驾驶之心原文链接&#xff1a;https://zhuanlan.zhihu.com/p/1979144898872627828 点击下方卡片&#xff0c;关注“自动驾驶之心”公众号戳我-> 领取自动驾驶近30个方向学习路线>>自动驾驶前沿信息获取→自动驾驶之心知识星球本文只做学术分…

作者头像 李华