合并排序不是一种新算法,并且有可用的解决方案。我试图编写自己的代码,但它有一些逻辑错误。 关于我做错了什么的见解?
public class MergeSort {
public static void main(String[] args) {
int[] array = {5,4,8,3,7,10};
mergeSort(array);
System.out.println("Sorted array: \n");
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
public static void mergeSort(int[] array) {
if (array.length > 1) {
int[] firstHalf = new int[array.length / 2];
System.arraycopy(array, 0, firstHalf, 0, array.length / 2);
mergeSort(firstHalf);
int[] secondHalf = new int[array.length - array.length/2];
System.arraycopy(array, array.length / 2, secondHalf, 0, array.length - array.length/2);
mergeSort(secondHalf);
merge(firstHalf, secondHalf, array);
}
}
public static void merge(int[] firstHalf, int[] secondHalf, int[] array) {
int i = 0;
int j = 0;
int k = 0;
for (k = 0; k < array.length; k++) {
for (i = 0, j = 0; i < firstHalf.length && j < secondHalf.length; i++, j++) {
if (firstHalf[i] < secondHalf[j]) {
array[k] = firstHalf[i];
i++;
} else if (secondHalf[j] < firstHalf[i]) {
array[k] = secondHalf[j];
j++;
}
}
}
}
}
答案 0 :(得分:1)
merge()函数存在多个问题:
merge()
不需要嵌套循环。注意
你用新的重复覆盖array[k]
的值
值。i
或j
两次。left=[1,2,3] right=[4,5,6]
。你弄清楚之后需要增加只有一个迭代器,而不是两个,你仍然会遇到一个问题,你永远不会触及2,3
中的元素left
。我的提示:在第一次实现算法时,尝试遵循一步一步的伪代码。如果你觉得你得到它,擦掉它并尝试再次写它,没有参考。