归并排序实现后返回与输入完全相同的数组,请求排错
归并排序代码问题排查
直接导致排序无效果的核心问题
- C语言值传递机制下原数组未被修改
函数的参数是值拷贝传递,merge_sort里的形参double* a是函数栈上的局部指针变量。你在函数内执行a = merge(left, right, N)时,只是把这个局部指针的指向修改为merge返回的新数组地址,既不会改变外部传入的实参指针指向,也不会修改原数组存储的内存内容。排序完成后原数组的数值没有任何改动,自然和输入完全一致。
修正方向:merge完成后,将结果数组的元素逐个拷贝回原a指向的内存空间;或通过传入二级指针修改外部实参的指向;或调整merge逻辑直接将合并结果按位置写回原数组的对应分段。
会引发运行异常、逻辑错误的其余问题
- 自实现
len函数完全不适用于double数值数组
你参考C风格字符串的终止判断逻辑,以'\0'(即数值0)作为数组结束标记,这套逻辑对存数值的double数组完全不成立:- 你动态开辟的
left、right数组没有在末尾设置终止标记,len函数会持续越界读取内存,直到偶然碰到值为0的内存单元,计算出的长度完全不可控; - 如果待排序数组本身包含0值元素,
len会提前截断计数,直接引发逻辑错误。
修正方向:拆分、合并子数组时直接通过参数传入子数组的实际长度,不要依赖遍历找终止符的方式计算数组长度。
- 你动态开辟的
- 左右分段的边界计算存在越界风险
你固定给左、右分段都分配了长度为mid的内存空间,没有根据总长度N动态调整右段长度。例如总长度N=5时,mid=(5+1)/2=3,right数组要从a[mid]开始连续读3个元素,会读到数组边界外的a[5]的非法内存。正确的拆分逻辑应该是左段长度为mid,右段长度为N - mid,保证两段长度总和与总数组长度一致。 - 存在内存泄漏隐患
代码中通过new开辟的left、right数组,以及merge函数内部的result数组,全程没有对应的delete操作释放内存,长期运行会造成内存占用持续上涨。
内容的提问来源于stack exchange,提问作者Prabesh
相关产品推荐
相关产品推荐

