c++中如何实现数组的归并排序递归版_c++分治算法代码实现【详解】
技术百科
尼克
发布时间:2026-01-22
浏览: 次 归并排序递归版的核心逻辑是分治:先二分至子数组长度≤1,再合并已排序子数组;关键在merge过程,需用临时数组避免覆盖,三指针合并后拷回原数组。
归并排序递归版的核心逻辑是什么
归并排序递归版本质是「分治」:把数组不断二分直到子数组长度 ≤ 1(自然有序),再逐层合并两个已排序的子数组。关键不在“递归调用”,而在 merge 过程——它必须用额外空间暂存结果,否则原地合并会覆盖未读取的数据。
如何正确写 merge 函数避免越界和覆盖
常见错误是直接往原数组 arr 写入,却没备份左/右半段;或下标计算错导致访问 arr[mid+1] 越界。必须用临时数组保存合并结果,再整体拷回。
-
left子数组范围是[l, m](闭区间),right是[m+1, r] - 三指针:i 指向左段起始,j 指向右段起始,k 指向临时数组起始
- 合并完后,用
std::copy或循环把temp中[0, r-l+1)段拷回arr[l]开始的位置
c++ 递归归并排序完整可运行代码
以下代码通过 vector 实现,避免手动管理内存,同时标注了易错点:
#include
#include void merge(std::vector
& arr, int l, int m, int r) { std::vector temp(r - l + 1); // 临时空间,大小必须是子数组总长 int i = l, j = m + 1, k = 0; while (i zuojiankuohaophpcn= m && j zuojiankuohaophpcn= r) { if (arr[i] zuojiankuohaophpcn= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i zuojiankuohaophpcn= m) temp[k++] = arr[i++]; while (j zuojiankuohaophpcn= r) temp[k++] = arr[j++]; // 必须拷回原位置:从 arr[l] 开始,共 temp.size() 个元素 std::copy(temp.begin(), temp.end(), arr.begin() + l);}
void mergeSort(std::vector
& arr, int l, int r) { if (l // 使用示例: // std::vector
v = {38, 27, 43, 3, 9, 82, 10}; // mergeSort(v, 0, v.size() - 1); 为什么不能用
int arr[]直接传参函数参数写
void mergeSort(int arr[], int l, int r)看似简洁,但实际是int*,无法获取数组长度,r完全依赖调用方传入——一旦错传(比如把sizeof(arr)/sizeof(*arr)写在函数内),就会越界。用std::vector或传入迭代器范围(如begin, end)更安全、更现代。另外,递归深度是
O(log n),但每层merge都要分配临时空间,总空间复杂度是O(n),这点常被忽略——如果内存受限,得考虑迭代版或原地归并(后者实现复杂且不稳定)。
# 就会 # 而在 # 都要 # 写在 # 不稳定 # 迭代 # 完后 # go # 循环 # 递归 # c++ # if # int # void # 指针 # 为什么 # 算法 # 却没 # 不能用 # copy # 归并排序
相关栏目: <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 AI推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 SEO优化<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 技术百科<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 谷歌推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 百度推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 网络营销<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 案例网站<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 精选文章<?muma echo $count; ?> 】
相关推荐
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Windows10系统怎么查看IP地址_Win10
- Win11如何设置开机自动联网 Win11宽带连接
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Win11怎么更改默认打开方式_Win11关联文件
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- 如何使用Golang反射将map转换为struct
- c++获取当前时间戳_c++ time函数使用详解
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 如何在 VS Code 中正确配置并使用 NumP
- php错误怎么开启_display_errors与
- win11 OneDrive怎么彻底关闭 Win1
- 如何在Golang中修改数组元素_通过指针实现原地
- 如何使用Golang实现容器安全扫描_Golang
- Win11怎么设置默认邮件应用_Windows11
- php怎么连接数据库_MySQL数据库连接的基础代
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Windows10电脑怎么设置虚拟内存_Win10
- Windows11如何设置专注助手_Windows
- Win11怎么查看局域网电脑_Windows 11
- c++中如何使用虚函数实现多态_c++多态性实现原
- 如何使用Golang管理跨项目依赖_Golang多
- php8.4新语法match怎么用_php8.4m
- Win10如何备份注册表_Win10注册表备份步骤
- c++怎么设置线程优先级与cpu亲和性_c++ 多
- LINUX下如何配置VLAN虚拟局域网_在LINU
- C++ STL算法库怎么用?C++常用算法函数(s
- Win11如何设置系统语言_Win11系统语言切换
- 如何诊断并终止卡死的 multiprocessin
- Windows10怎么查看系统激活状态_Windo
- 如何在Golang中实现CI/CD流水线自动化测试
- Win11怎么更改输入法顺序_Win11调整语言首
- Win10怎样安装PPT模板_Win10安装PPT
- Mac系统更新下载慢或失败怎么办_解决macOS升
- PHP主流架构如何做单元测试_工具与流程【详解】
- Win11任务栏怎么固定应用 Win11将软件图标
- Win11系统占用空间大怎么办 Win11深度瘦身
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- Windows10如何更改系统字体大小_Win10
- 如何更改Windows资源管理器的默认启动位置?(
- C#如何序列化对象为XML XmlSerializ
- Win11文件扩展名怎么显示_Win11查看文件后
- 如何在 Python 中将 ISO 8601 时间
- php和redis连接超时怎么办_phpredis
- 如何在Golang中优化文件读写性能_使用缓冲和并
- mac怎么安装adb_MAC配置Android A
- 如何使用Golang template生成文本模板
- Win10如何关闭安全中心所有通知 Win10禁用
- c++中的Tag Dispatching是什么_c


QQ客服