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

Java版MergeSort排序结果异常输出大量零的问题求助

归并排序输出异常求助

跟着BroCode的教程实现Java归并排序,输入数组{8,4,5,3,2,7,1,9,0,6},期望得到升序排序结果,但实际输出是0000002468。核对教程代码没发现问题,自己还没完全理解算法,求帮忙排查解决。

原代码

class m{
    public static void main(String[]args){
        int array[] = {8,4,5,3,2,7,1,9,0,6};

        mergeSort(array);
    
    for(int i =0;i<array.length;i++){
        System.out.print(array[i] + "");

    }

}
private static void mergeSort(int[]array){

    int length = array.length;
    if(length<=1)return;//base case
    int middle = length/2;
    int leftArray[] = new int[middle];
    int rightArray[] = new int[length-middle];
    int i=0;//left array
    int j = 0;//right array
    for(;i<length;i++){
        if(i<middle){
            leftArray[i] = array[i];

        }else{
            rightArray[j] = array[i];
        }
    }mergeSort(leftArray);
     mergeSort(rightArray);
     merge(leftArray,rightArray,array);

    }

    private static void merge(int[]leftArray,int[]rightArray,int[]array){
        int leftSize = array.length/2;
        int rightSize = array.length-leftSize;
        int i=0,l=0,r=0;

        // check conditions for merging

        while(l<leftSize && r<rightSize){
            if(leftArray[l]<rightArray[r]){
                array[i] = leftArray[l];
                i++;
                l++;
            }else{
                array[i] = rightArray[r];
                i++;
                r++;
            }
        }
        while(l<leftSize){
            array[i] = leftArray[l];
            i++;
            l++;

        }
        while(r<rightSize){
            array[i] = rightArray[r];
            i++;
            r++;
        }
    }
}

问题排查与修复

两个核心错误:

  1. 右数组赋值时未递增索引j
    在mergeSort的循环里,当i >= middle时,给rightArray[j]赋值后没有执行j++,导致右数组所有元素都被塞到rightArray[0],其余位置都是默认的0。这就是输出里一堆0的直接原因。

  2. merge方法中左右数组大小计算错误
    原代码用array.length/2计算左数组大小,但递归时传入的array长度会动态变化,应该直接用leftArray.length和rightArray.length获取实际长度,避免计算偏差。

修复后的代码

class m{
    public static void main(String[]args){
        int array[] = {8,4,5,3,2,7,1,9,0,6};

        mergeSort(array);
    
        for(int i =0;i<array.length;i++){
            System.out.print(array[i] + " "); // 加空格让输出更清晰
        }
    }

    private static void mergeSort(int[]array){
        int length = array.length;
        if(length<=1)return;//base case
        int middle = length/2;
        int leftArray[] = new int[middle];
        int rightArray[] = new int[length-middle];
        int i=0;//left array
        int j = 0;//right array
        for(;i<length;i++){
            if(i<middle){
                leftArray[i] = array[i];
            }else{
                rightArray[j] = array[i];
                j++; // 关键修复:赋值后递增右数组索引
            }
        }
        mergeSort(leftArray);
        mergeSort(rightArray);
        merge(leftArray,rightArray,array);
    }

    private static void merge(int[]leftArray,int[]rightArray,int[]array){
        int leftSize = leftArray.length; // 直接用左数组实际长度
        int rightSize = rightArray.length; // 直接用右数组实际长度
        int i=0,l=0,r=0;

        // 合并逻辑
        while(l<leftSize && r<rightSize){
            if(leftArray[l]<rightArray[r]){
                array[i] = leftArray[l];
                i++;
                l++;
            }else{
                array[i] = rightArray[r];
                i++;
                r++;
            }
        }
        while(l<leftSize){
            array[i] = leftArray[l];
            i++;
            l++;
        }
        while(r<rightSize){
            array[i] = rightArray[r];
            i++;
            r++;
        }
    }
}

运行修复后的代码,输出会是0 1 2 3 4 5 6 7 8 9,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:15:06