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

Java归并排序问题:merge返回的有序数组未更新原数组

归并排序后原数组未更新的问题修复

你的问题核心是sort方法没有将mergesort返回的排序后数组同步回原输入数组。

mergesort方法确实能正确递归拆分、合并并返回排序后的新数组,但sort方法里仅仅调用了mergesort(a),却没有把返回的结果赋值给原数组a——Java中数组是引用类型,但这里mergesort返回的是全新的数组对象,原数组a的引用并没有指向这个新数组,所以原数组的内容完全没被修改。

修复方案

在sort方法中,接收mergesort返回的排序数组,再将其内容拷贝回原数组:

@Override
public void sort(Comparable[] a) {
    if(a == null || a.length <= 1){
        return;
    }
    Comparable[] sortedArray = mergesort(a);
    // 将排序后的数组内容拷贝回原数组
    System.arraycopy(sortedArray, 0, a, 0, a.length);
}

完整修改后的代码

@Override
public void sort(Comparable[] a) {
    if(a == null || a.length <= 1){
        return;
    }
    Comparable[] sortedArray = mergesort(a);
    System.arraycopy(sortedArray, 0, a, 0, a.length);
}

@Override
public Comparable[] mergesort(Comparable[] a) {
    int length = a.length;

    if(length <= 1){return a;} //base case

    int middle = length / 2;
    Comparable[] leftArray = new Comparable[middle];
    Comparable[] rightArray = new Comparable[length - middle];
    int l = 0, r = 0;

    for(; l < length; l++){     //copy contents to either left or right side
        if(l < middle){
            leftArray[l] = a[l];
        }
        else{
            rightArray[r] = a[l];
            r++;
        }
    }

    leftArray = mergesort(leftArray);       //sort left side
    rightArray = mergesort(rightArray);      //sort right side
    return merge(leftArray, rightArray);   //merge the two
}

@Override
public Comparable[] merge(Comparable[] a, Comparable[] b) {
    Comparable[] array = new Comparable[a.length + b.length];
    int arrayIndex = 0, aIndex = 0, bIndex = 0;

    while(aIndex < a.length && bIndex < b.length){
        if(less(a[aIndex], b[bIndex])){
            array[arrayIndex] = a[aIndex];
            aIndex++;
        }
        else{
            array[arrayIndex] = b[bIndex];
            bIndex++;
        }
        arrayIndex++;
    }
    while(aIndex < a.length){
        array[arrayIndex] = a[aIndex];
        arrayIndex++;
        aIndex++;
    }
    while(bIndex < b.length){
        array[arrayIndex] = b[bIndex];
        arrayIndex++;
        bIndex++;
    }
    System.out.print("MERGE: ");
    show(array);
    return array;
}

这样修改后,原数组a会被更新为排序后的内容,输入"SORTEXAMPLE"就能得到期望的有序数组"A E E L M O P R S T X"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:53:13