在Java中实现合并排序:仅为零

时间:2017-01-06 13:07:23

标签: java algorithm sorting mergesort

我试图在Java中实现一些排序算法,作为教育过程在int-arrays上工作。我目前试图围绕合并排序。昨天我走得很远,结果是一个正确大小的数组,但只包含零。今天我从地面开始新的,现在我陷入了同样的困境。 ^^ 这是我的代码:

public static int[] mergeSort(int[] array) {
    if (array.length < 2) {
        return array;
    }
    int left = 0;
    int right = array.length;
    int p = array.length / 2;
    int[] lArray = Arrays.copyOfRange(array, left, p);
    int[] rArray = Arrays.copyOfRange(array, p, right);
    lArray = mergeSort(lArray);
    rArray = mergeSort(rArray);
    return merge(lArray, rArray);
}

private static int[] merge(int[] lArray, int[] rArray) {
    int[] result = new int[lArray.length + rArray.length];
    int idx = 0;
    int rIdx = 0;
    int lIdx = 0;
    while (lIdx < lArray.length - 1 && rIdx < rArray.length - 1) {
        if (lArray[lIdx] < rArray[rIdx]) {
            result[idx] = lArray[lIdx];
            lIdx++;
        } else if (lArray[lIdx] >= rArray[rIdx]) {
            result[idx] = rArray[rIdx];
            rIdx++;
        }
        idx++;
    }
    if (lIdx < (lArray.length - 1)) {
        result[idx] = lArray[lIdx + 1];
    } else if (rIdx < (rArray.length - 1)) {
        result[idx] = rArray[rIdx + 1];
    }
    return result;
}

我觉得它很漂亮,风格可读。所以,你所有的算法和Java都在那里破解,我错过了什么?调试指向合并方法,但我无法将其固定,因此我按原样发布。

提前致谢!

3 个答案:

答案 0 :(得分:1)

我在merge方法中看到了两个问题:

首先,while循环忽略左右数组的最后一个元素。你应该改变

while (lIdx < lArray.length - 1 && rIdx < rArray.length - 1)

while (lIdx < lArray.length && rIdx < rArray.length)

其次,在循环之后,你还需要两个while循环来添加左数组的尾部或右数组的尾部。相反,您只需添加一个元素。

替换

if (lIdx < (lArray.length - 1)) {
    result[idx] = lArray[lIdx + 1];
} else if (rIdx < (rArray.length - 1)) {
    result[idx] = rArray[rIdx + 1];
}

while (lIdx < lArray.length) {
    result[idx++] = lArray[lIdx++];
} 
while (rIdx < rArray.length) {
    result[idx++] = rArray[rIdx++];
}

答案 1 :(得分:0)

if (lIdx < (lArray.length - 1)) {
    result[idx] = lArray[lIdx + 1];
} else if (rIdx < (rArray.length - 1)) {
    result[idx] = rArray[rIdx + 1];
}

这部分有点奇怪。为什么只将一个剩余元素复制到结果数组中?您应该将lArray或rArray中的所有剩余元素复制到结果中。使用&#39; while&#39;而不是&#39;如果&#39;。

答案 2 :(得分:0)

你去吧

public class MergeSort {

public static int[] mergeSort(int[] array) {
    if (array.length < 2) {
        return array;
    }
    int left = 0;
    int right = array.length;
    int p = array.length / 2;
    int[] lArray = Arrays.copyOfRange(array, left, p);
    int[] rArray = Arrays.copyOfRange(array, p, right);
    //printArray(lArray); seems ok
    //printArray(rArray); seems ok
    lArray = mergeSort(lArray);
    rArray = mergeSort(rArray);
    return merge(lArray, rArray);
}

private static int[] merge(int[] lArray, int[] rArray) {
    /*System.out.println("Ive got");
    printArray(lArray);
    printArray(rArray); seems ok*/
    int[] result = new int[lArray.length + rArray.length];
    int index = 0;
    int rightIndex = 0;
    int leftIndex = 0;
    while (leftIndex < lArray.length && rightIndex < rArray.length) { //TODO
        if (lArray[leftIndex] < rArray[rightIndex]) {
            result[index] = lArray[leftIndex];

            leftIndex++;
            index++;
            //} else if (lArray[leftIndex] >= rArray[rightIndex]) { // You don't have to check it!!!
        } else {
            System.out.println("2 left index " + leftIndex + " index " + index);
            result[index] = rArray[rightIndex];
            rightIndex++;
            index++;
        }
    }
    while (leftIndex < (lArray.length)) { // TODO
        result[index] = lArray[leftIndex];
        index++;
        leftIndex++;
    }
    while (rightIndex < (rArray.length)) { // TODO
        result[index] = rArray[rightIndex];
        index++;
        rightIndex++;
    }
    System.out.println("Returning ");
    printArray(result);
    return result;
}

public static void printArray(int[] arr) {
    for (int i : arr)
        System.out.print(i + " ");
    System.out.println();
}

public static void main(String[] args) {
    int[] arr = {2, 1, 3, 4, 0, -1};
    printArray(arr);
    arr = mergeSort(arr);
    printArray(arr);
}
}

标有//TODO

的错误