Java合并排序没有给出良好的结果

Java合并排序没有给出良好的结果,java,recursion,mergesort,Java,Recursion,Mergesort,我是java的初学者。这是我的合并排序代码,但它没有给我有利的结果。有人能解释一下我犯的错误吗 public class Test { public int arr[] = {5,7,8,4,3,2,6,1}; public static void main(String args[]) { Test t = new Test(); System.out.println("Before sorting"+ Arrays.toString(t.arr)); t.merg

我是java的初学者。这是我的合并排序代码,但它没有给我有利的结果。有人能解释一下我犯的错误吗

public class Test {

public int arr[] = {5,7,8,4,3,2,6,1};

public static void main(String args[]) {
    Test t = new Test();
    System.out.println("Before sorting"+ Arrays.toString(t.arr));
    t.mergeSort(t.arr);
    System.out.println("After Sorting"+ Arrays.toString(t.arr));

}


public void mergeSort(int[] a){
    int n = a.length;
    if(n < 2)
        return;
    int m = n/2;
    int[] left = new int[m];
    int[] right = new int[n - m];
    for(int i = 0;i < m;i++) {
        left[i] = a[i];
    }
    for(int i = m;i < n;i++) {
        right[i - m] = a[i];
    }
    mergeSort(left);
    mergeSort(right);
    merge(left,right,arr);
}

private void merge(int[] left, int[] right, int[] arr2) {
    int n = left.length;
    int m = right.length;
    int i=0,j=0, k=0;
    while(i < n && j < m) {
        if(left[i] < right[j]) {
            arr2[k] = left[i];
            i++;
            k++;
        }
        else {
            arr2[k] = right[j];
            j++;
            k++;
        }

    }
    while(i<n) {
        arr2[k] = left[i];
        i++;
        k++;
    }
    while(j<m) {
        arr2[k] = right[j];
        j++;
        k++;
    }


}
}
公共类测试{
公共int arr[]={5,7,8,4,3,2,6,1};
公共静态void main(字符串参数[]){
测试t=新测试();
System.out.println(“排序前”+数组.toString(t.arr));
t、 合并排序(t.arr);
System.out.println(“排序后”+数组.toString(t.arr));
}
公共无效合并排序(int[]a){
int n=a.长度;
if(n<2)
返回;
int m=n/2;
int[]左=新的int[m];
int[]right=新int[n-m];
for(int i=0;i而(i您的问题是,在mergeSort(左)和mergeSort(右)之后,左和右实际上没有被排序,因为数组arr是在合并步骤中实际修改的唯一内容

通常,您将只使用单个数组实现MergeSort,并为在每个合并或递归步骤中处理的数组部分传递相关的开始和结束索引


然后您将有类似于mergeSort(int[]a,int leftIndex,int righindex)和mergeSort(a,0,a.length-1)的内容将对整个数组a进行排序。

@JoeC感谢您提供的链接。我已经调试了我的代码。当我们使用merge方法对子数组进行排序后返回时,它似乎正在对未排序的数组执行mergesort方法。理想情况下,它应该合并数组左侧的{5,7}和{4,8},但它合并了{5,7}和{8,4},即使我已经对{8,4}子数组进行了排序。