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