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

采用首尾索引传参的C++归并排序代码无法输出预期结果

归并排序代码错误排查

核心问题定位

错误出在mergeArray函数末尾将临时数组拷贝回原数组的循环逻辑:

int k=0;
for (i = si; i < size; i++)
{
    a[i] = temp[k];
    k++;
}

这里的循环终止条件i < size不符合逻辑:
size是当前需要合并的元素总长度,你要覆盖的原数组区间是[si, end](即从si开始的连续size个元素),当si的值大于等于size时,循环会直接不执行,临时数组中排好序的内容不会被写回原数组,自然输出错误。

比如你测试输入6 5 4 3时,合并下标为[2,3]的两个元素时,si=2、size=2,i=2不满足i < 2的条件,循环直接跳过,temp中排好序的3,4不会写回原数组,原数组对应位置还是4,3,最终合并结果就会出错。而测试6 5 4 9时,[2,3]区间的元素本来就是升序,就算没有写回也不会影响最终结果,所以看上去运行正常。

修复方案

将拷贝逻辑替换为以下任意一种即可:

方案1(最简洁):按偏移量直接赋值

for(int k = 0; k < size; k++){
    a[si + k] = temp[k];
}

方案2:修改原循环终止条件

int k=0;
for (i = si; i < si + size; i++)
{
    a[i] = temp[k];
    k++;
}

额外优化建议

你代码中使用的变长数组int temp[size];是C语言扩展特性,不属于标准C++语法,部分编译器可能不支持。建议替换为用new申请的动态数组(使用后记得delete[]释放),或者直接使用vector<int>存储临时排序数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:08