归并排序核心是分治与辅助数组合并,C++中需显式管理临时空间;关键在精准控制left、mid、right边界,用temp安全合并,避免越界或覆盖;merge函数须严格按两段已排序子数组处理,双指针分别从left和mid+1开始。
归并排序在 C++ 中必须显式管理辅助空间,不能像 Python 那样靠切片隐式分配。关键不是“写个递归”,而是控制好 left、mid、right 三段边界,以及用临时数组 temp 安全合并——否则极易越界或覆盖原数组。
常见错误是下标计算混乱,比如把 mid + 1 写成 mid,或漏掉 right - left + 1 的长度判断。合并逻辑必须严格按两段已排序子数组处理:
left 和 mid + 1 开始扫描arr[i] (注意等号,保证稳定)
right
temp 中 [0, right-left] 范围拷回 arr[left] 起始位置void merge(std::vector& arr, int left, int mid, int right) { std::vector temp(right - left + 1); int i = left, j = mid + 1, k = 0; while (i zuojiankuohaophpcn= mid && j zuojiankuohaophpcn= right) { if (arr[i] zuojiankuohaophpcn= arr[j]) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; } while (i zuojiankuohaophpcn= mid) temp[k++] = arr[i++]; while (j zuojiankuohaophpcn= right) temp[k++] = arr[j++]; for (int idx = 0; idx zuojiankuohaophpcn temp.size(); ++idx) { arr[left + idx] = temp[idx]; }}
mergesort 递归调用的边界条件怎么设
递归终止条件必须是
left >= right,而不是left == right——否则当输入为空或单元素时可能跳过,尤其用vector时size()==0会导致left=0, right=-1,此时left > right才合法。调用时传入的是闭区间[left, right],所以拆分是:
- 左半:
left到mid(含)- 右半:
mid + 1到right(含)mid计算用(left + right) / 2,整数除法向下取整,安全void mergesort(std::vector
& arr, int left, int right) { if (left >= right) return; int mid = left + (right - left) / 2; mergesort(arr, left, mid); mergesort(arr, mid + 1, right); merge(arr, left, mid, right); } 为什么不能直接在原地合并
归并排序本质需要同时读取两段有序数据、写入第三段空间。如果试图在原数组上“边读边写”,会覆盖尚未读取的元素——例如左段最大值还没被取走,就被右段较小值提前写入左段位置。这也是所有标准实现都依赖额外
O(n)空间的根本原因。用std::inplace_merge是特例,它底层仍需临时缓冲,且仅适用于已分割好的连续迭代器范围,不适用于通用递归分治场景。最容易被忽略的是:每次
merge前,左右两段必须各自有序——这个前提由递归保证,但调试时若发现结果错乱,第一反应不该是改merge,而应检查递归是否真把[left, mid]和[mid+1, right]分对了,尤其是mid的计算和传递有没有溢出或截断。
相关文章: php条件判断怎么写_ifelse和switchcase的使用区别【对比】 如何选择域名并搭建高效网站? ,石家庄四十八中学官网? 早安海报制作网站推荐大全,企业早安海报怎么每天更换? 正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好? 如何通过二级域名建站提升品牌影响力? 专业网站制作服务公司,有哪些网站可以免费发布招聘信息? 建站之星如何修改网站生成路径? 合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍? 如何高效配置IIS服务器搭建网站? 浅析上传头像示例及其注意事项 洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些? 如何快速搭建响应式可视化网站? Android滚轮选择时间控件使用详解 网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗? 如何选择靠谱的建站公司加盟品牌? 武汉外贸网站制作公司,现在武汉外贸前景怎么样啊? 沈阳制作网站公司排名,沈阳装饰协会官方网站? 重庆网站制作公司哪家好,重庆中考招生办官方网站? 如何快速搭建高效WAP手机网站? 制作无缝贴图网站有哪些,3dmax无缝贴图怎么调? 电视网站制作tvbox接口,云海电视怎样自定义添加电视源? 为什么Go需要go mod文件_Go go mod文件作用说明 制作农业网站的软件,比较好的农业网站推荐一下? 建站之星安装需要哪些步骤及注意事项? 如何在香港免费服务器上快速搭建网站? 非常酷的网站设计制作软件,酷培ai教育官方网站? c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】 建站主机是什么?如何选择适合的建站主机? 成都响应式网站开发,dw怎么把手机适应页面变成网页? c# Task.ConfigureAwait(true) 在什么场景下是必须的 广东专业制作网站有哪些,广东省能源集团有限公司官网? 寿县云建站:智能SEO优化与多行业模板快速上线指南 赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的? 山东网站制作公司有哪些,山东大源集团官网? 香港服务器网站卡顿?如何解决网络延迟与负载问题? 微信h5制作网站有哪些,免费微信H5页面制作工具? 微信小程序 五星评分(包括半颗星评分)实例代码 建站之星各版本价格是多少? 如何制作一个表白网站视频,关于勇敢表白的小标题? 建站之星如何实现五合一智能建站与营销推广? 建站之星下载版如何获取与安装? 建站之星后台管理系统如何操作? 交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续? javascript基本数据类型及类型检测常用方法小结 如何快速上传建站程序避免常见错误? 如何快速完成中国万网建站详细流程? 如何使用Golang table-driven基准测试_多组数据测量函数效率 西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么? 昆明高端网站制作公司,昆明公租房申请网上登录入口?
*请认真填写需求信息,我们会在24小时内与您取得联系。