【发布时间】:2020-07-29 03:06:08
【问题描述】:
我正在尝试在 Java 中实现 MergeSort 算法,以便它对来自 A[start..end] 的数组进行排序。我真的很难实现它,以便它不包括在合并中传入的最后一个索引。我正在尝试追踪我的代码,但一直感到困惑。
这是我的代码:
public class MergeSort {
public static void main(String[] args) {
int[] list = new int[] { 3, 7, 5, 2, 9 };
int[] result = mergeSort(list, 0, list.length);
System.out.print("[");
for (int i = 0; i < result.length; i++) {
System.out.print(" " + result[i]);
}
System.out.println("]");
}
public static int[] mergeSort(int[] list, int start, int end) {
if (end - start < 2) {
return list;
} else {
int mid = (start + end) / 2;
mergeSort(list, start, mid);
mergeSort(list, mid + 1, end);
merge(list, start, mid, end);
return list;
}
}
public static void merge(int[] list, int start, int mid, int end) {
int[] copy = new int[list.length];
for (int i = 0; i < list.length; i++) {
copy[i] = list[i];
}
int i = start;
int k = start;
int j = mid + 1;
while (i <= mid && j <= end) {
if (copy[i] <= copy[j]) {
list[k] = copy[i];
i++;
} else {
list[k] = copy[j];
j++;
}
k++;
}
while (i <= mid) {
list[k] = copy[i];
i++;
k++;
}
while (j < end) {
list[k] = copy[j];
j++;
k++;
}
}
}
【问题讨论】:
-
您不应该从问题中删除代码,因为它会使答案不一致。该代码有一些错误,我指出并帮助纠正了这些错误。这没有问题,所有程序员都会犯错误,向他人学习是改进的方法。其他读者会阅读您的代码并且会或不会看到问题,无论如何这是一个很好的练习。阅读代码比编写代码困难得多,因此请尝试看看我在答案中提出了哪些更正建议以及我做了哪些其他更改。
-
编程学校通常不教授排除上限,但它是一种更好的方法,并且使代码更简单、更通用。我希望每个人都能这样教
mergesort。
标签: java algorithm sorting mergesort