You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用std::vector实现归并排序出现未知异常值问题求助

问题分析与修复方案

你的代码存在两个核心错误,直接导致了乱码输出和排序不生效的问题:

  • 错误1:mergeSort 函数参数为值传递
    C++中如果给函数传递vector<int>类型时不加引用符号&,会触发vector的深拷贝,你在递归过程中修改的都是拷贝出来的临时数组,修改结果完全不会同步到上层调用的数组,更不会修改main函数中定义的原数组。这也是你最终输出和初始数组完全一致的原因。
  • 错误2:merge 函数的临时数组下标越界访问
    你定义的tmp是一个空vector,所有元素都是从下标0开始依次push_back存入的,但你最后赋值回原数组时,直接用tmp[i]取值,而i是从low开始计数的,当low>0时,你访问的tmp[i]已经超出了tmp的实际长度,属于非法内存访问,读取到的就是内存中未定义的垃圾值,也就是你看到的655696、-1112271603这类奇怪数值。
修复代码

只需要修改两处即可:

  1. 修改mergeSort的参数为引用传递:
// 原代码:void mergeSort(vector<int> arr, int start, int tail)
void mergeSort(vector<int>& arr, int start, int tail)
  1. 修改merge函数最后赋值的下标映射:
for (int i = low; i <= high; i++)
{
    // 原代码:arr[i] = tmp[i];
    arr[i] = tmp[i - low];
}
调试思路参考
  • 遇到乱码值优先排查数组/容器越界访问问题,可以在访问下标前打印容器长度和当前下标,确认是否有下标超过长度的情况
  • 发现修改不生效时,可以打印变量的内存地址(比如cout << &arr << endl;),确认不同调用层级操作的是不是同一个对象

内容的提问来源于stack exchange,提问作者Irvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:09:03