Java 合并排序不是实际排序

Java 合并排序不是实际排序,java,mergesort,Java,Mergesort,我需要只使用参数的数组来实现mergesort。我可以看到,它很好地将其拆分并重新组装,但实际上它并没有在这样做时对其进行排序。我确信这与我在哪里/如何称呼事物有关。你能帮我指出哪里没有收集到正确的数据,这样我就可以修复它了吗 public static void mergesort(Comparable[] a) { a = mergeSort(a); } public static Comparable[] mergeSort(Comparable[] a) { Compa

我需要只使用参数的数组来实现mergesort。我可以看到,它很好地将其拆分并重新组装,但实际上它并没有在这样做时对其进行排序。我确信这与我在哪里/如何称呼事物有关。你能帮我指出哪里没有收集到正确的数据,这样我就可以修复它了吗

public static void mergesort(Comparable[] a) {
    a = mergeSort(a);
}

public static Comparable[] mergeSort(Comparable[] a) {
    Comparable[] first, second;
    int length1 = a.length / 2;
    int length2 = a.length - length1;

    first = Arrays.copyOfRange(a, 0, length1);
    second = Arrays.copyOfRange(a, length1, a.length);

    if(length1 > 0 && length2 > 0) {
        first = mergeSort(first);
        System.out.print("First: ");
        show(first);
        second = mergeSort(second);
        System.out.print("Second: ");
        show(second);
        a = merge(first, second);
        System.out.print("\nAfter: ");
        show(a);
    }
    return a;
}

public static Comparable[] merge(Comparable[] a, Comparable[] b) {
    Comparable[] temp = new Comparable[a.length + b.length];
    int aFirst = 0, aLast = a.length - 1;
    int bFirst = 0, bLast = b.length - 1;
    int index = aFirst;

    while(aFirst <= aLast && bFirst <= bLast) {
        if(a[aFirst].compareTo(b[bFirst]) < 0) {
            temp[index] = a[aFirst++];
        } else {
            temp[index] = b[bFirst++];
        }
        index++;
    }

    while(aFirst <= aLast) {
        temp[index] = a[aFirst++];
        index++;
    }

    while(bFirst <= bLast) {
            temp[index] = b[bFirst++];
            index++;
    }
    return temp;
}
这两个电话:

mergesort(first);
mergesort(second);
将数组
第一个
第二个
排序为新数组,但忽略已排序的数组。您的代码应该是:

first = mergeSort(first);
second = mergesort(second);

实际的问题是,您有两个名称相似的方法(
mergesort
mergesort
),但预期行为非常不同:其中一个方法尝试对其输入进行排序并返回排序结果,而不修改输入,而另一个不返回排序结果,因此必须修改其输入

这两种方法都有优点。但您当前的代码将这些方法混合在一起,这就错了


当前代码缺少的是将排序后的元素存储回参数数组:

public static void mergesort(Comparable[] a) {
    Comparable[] sorted = mergeSort(a);
    System.arrayCopy(sorted, 0, a, 0, a.length);
}
并且:如果您的helper方法不能从您的类外部调用,请将它们设置为private,如下所示:

private static Comparable[] mergeSort(Comparable[] a) {
    ...
}

private static Comparable[] merge(Comparable[] a, Comparable[] b) {
    ...
}
甚至将helper方法重命名为
mergeSortHelper


最终目标始终是使您的代码尽可能可读,并向代码的任何读者显示您的意图。

相信我,合并排序实际上是排序的。我相信它确实如此,但此实现实际上并不是排序。这就是我要问的。因为mergesort是空的,所以你总是把结果扔掉。第二个方法mergesort被认为是递归的辅助方法。这可能是我做得不对的地方。我想修改输入。
private static Comparable[] mergeSort(Comparable[] a) {
    ...
}

private static Comparable[] merge(Comparable[] a, Comparable[] b) {
    ...
}