合并排序的Java代码出错

时间:2016-01-14 19:31:55

标签: java algorithm sorting merge

合并排序不是一种新算法,并且有可用的解决方案。我试图编写自己的代码,但它有一些逻辑错误。 关于我做错了什么的见解?

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++;

                }
            }
        }

    }
}

1 个答案:

答案 0 :(得分:1)

merge()函数存在多个问题:

  • 最明显的一个,merge()不需要嵌套循环。注意 你用新的重复覆盖array[k]的值 值。
  • 另一个问题是在内循环的每次迭代中你增加一个 ij两次。
  • 此外,还有一些你从未接触过的元素,其中一个数组中最大的元素(考虑一下你是否有一个已排序的数组,所以你有left=[1,2,3] right=[4,5,6]。你弄清楚之后需要增加只有一个迭代器,而不是两个,你仍然会遇到一个问题,你永远不会触及2,3中的元素left

我的提示:在第一次实现算法时,尝试遵循一步一步的伪代码。如果你觉得你得到它,擦掉它并尝试再次写它,没有参考。