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

自定义归并排序处理二维int数组时无限运行问题排查求助

问题原因

  • 核心问题1:缺少递归终止条件,导致无限递归
    归并排序的拆分逻辑必须设置终止边界,当前代码未判断输入数组的长度,当数组长度≤1时本身已经有序,不需要继续拆分排序,直接返回即可。缺失该判断会导致程序持续对长度为1甚至0的数组做拆分操作,永远无法进入合并逻辑,表现为无限执行甚至栈溢出。
  • 核心问题2:比较逻辑与降序要求不符
    当前merge方法中的判断条件left[i][1] < right[j][1]实现的是按数组第二个元素升序排列,和你需要的降序逻辑相反。

修正后的完整代码

void mergeSort(int[][] boxTypes){
    // 新增递归终止条件
    if (boxTypes.length <= 1) {
        return;
    }
    int mid = boxTypes.length / 2;
    int[][] left = new int[mid][2];
    int[][] right = new int[boxTypes.length - mid][2];
    
    for(int i = 0; i < mid; i++) left[i] = boxTypes[i];
    for(int i = mid; i < boxTypes.length; i++) right[i - mid] = boxTypes[i];
    
    mergeSort(left);
    mergeSort(right);
    
    merge(left, right, boxTypes);
}

void merge(int[][] left, int[][] right, int[][] boxTypes){
    int i = 0; int j = 0; int k = 0;
    
    while(i < left.length && j < right.length){
        // 修改比较逻辑为降序:左数组元素更大时优先取左数组
        if(left[i][1] > right[j][1]){
            boxTypes[k][0] = left[i][0];
            boxTypes[k][1] = left[i++][1];
        } else {
            boxTypes[k][0] = right[j][0];
            boxTypes[k][1] = right[j++][1];
        }
        k++;
    }
    
    // 剩余元素改为逐属性赋值,保持逻辑统一避免潜在问题
    while(i < left.length) {
        boxTypes[k][0] = left[i][0];
        boxTypes[k][1] = left[i++][1];
        k++;
    }
    while(j < right.length) {
        boxTypes[k][0] = right[j][0];
        boxTypes[k][1] = right[j++][1];
        k++;
    }
}

用测试用例[[5,10],[2,5],[4,7],[3,9]]运行上述代码,可得到预期输出[[5,10],[3,9],[4,7],[2,5]]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:57:02