Java 为什么这种方法不起作用?

Java 为什么这种方法不起作用?,java,recursion,mergesort,Java,Recursion,Mergesort,我在创建此测试代码时使用了中的自顶向下psuedo代码: public static void main(String args[]) { int[] nums = new int[] { 17, 5, 3, 7, 6, 3, 11, 2 }; mergeSort(nums); for (int i = 0; i < nums.length; i++) { System.out.print(nums[i] + " ,"); } } publ

我在创建此测试代码时使用了中的自顶向下psuedo代码:

public static void main(String args[]) {
    int[] nums = new int[] { 17, 5, 3, 7, 6, 3, 11, 2 };
    mergeSort(nums);
    for (int i = 0; i < nums.length; i++) {
        System.out.print(nums[i] + " ,");
    }
}

public static void mergeSort(int[] A) {
    int[] B = new int[A.length];
    System.arraycopy(A, 0, B, 0, A.length);
    splitMerge(B, 0, A.length, A); // sort data from B[] into A[]
}

public static void splitMerge(int[] B, int begin, int end, int[] A) {
    if (end - begin < 2)
        return;
    int middle = (end + begin) / 2;
    splitMerge(B, begin, middle, A);
    splitMerge(B, middle, end, A);
    System.out.println("begin: " + begin +  " mid: " + ((end - begin)/2) + " end: " + end + " SIZE: " + (end-begin));
    merge(B, begin, middle, end, A);

}

public static void merge(int[] B, int begin, int middle, int end, int[] A) {
    int i = begin;
    int j = middle;
    for (int k = begin; k < end; k++) {
        if (i < middle && (j >= end || B[i] <= B[j])) {
            A[k] = B[i];
            i = i + 1;
        } else {
            A[k] = B[j];
            j = j + 1;
        }
    }
}

您的
B
数组包含原始数组的一个副本,您在更改原始
a
数组时从不更改它

这意味着
merge
方法无法工作,因为它合并了两个未排序的数组(
B
的两个子数组,在整个算法中保持未排序)

为了正确执行
合并
,您应该将索引从
开始
结束
的元素从
A
数组复制到合并方法开始处的
B
数组

你所要做的就是添加语句

System.arraycopy(A, begin, B, begin, end - begin);
作为
merge
方法的第一条语句

i、 e:


对于给定的输入。

您进行了哪些调试?让我们为您调试的要求太广泛了。进行一些调试,当您遇到我们可以帮助您解决的特定问题时再发回。问题应该出现在“merge”方法中,因为正如输出所示,递归将数组正确地分成了两半。问题是此代码应该可以工作,因为它来自Wikipedia。如果此代码不起作用,则Wikipedia可能显示了错误的信息。与Wiki页面相比,
splitMerge(B,begin,middle,A)行上的
A
B
似乎已被切换
拆分合并(B,中间,结尾,A)。我建议通过复制粘贴原始元代码,然后进行适当编辑,以适应特定语言,从而避免这种混淆(为了便于阅读,可能会暂时将原始代码保留在注释中)。否则,可能会出现一些由于手动复制而导致的不精确性。
System.arraycopy(A, begin, B, begin, end - begin);
public static void merge(int[] B, int begin, int middle, int end, int[] A) {
    System.arraycopy(A, begin, B, begin, end - begin);
    int i = begin;
    int j = middle;
    for (int k = begin; k < end; k++) {
        if (i < middle && (j >= end || B[i] <= B[j])) {
            A[k] = B[i];
            i = i + 1;
        } else {
            A[k] = B[j];
            j = j + 1;
        }
    }
}
2 ,3 ,3 ,5 ,6 ,7 ,11 ,17 ,