有mergesort算法的问题

时间:2012-03-20 02:07:05

标签: java algorithm sorting merge mergesort

我目前正在尝试将一个mergesort算法从伪代码级转录为java中的工作实现。这是我的代码

public int[] merge(int a[], int b[]) {
        int c[] = new int[a.length + b.length];
        int i = 0, j = 0;
        for (int k = 0; k < c.length; k++) {
            if (a[i] <= b[j]) {
                c[k] = a[i++];
            } else {
                c[k] = b[j++];
            }
        }
        return c;
    }

根据我的知识,伪代码解释是正确的,但它不断返回ArrayOutofBound异常。 我在哪里弄错了。

2 个答案:

答案 0 :(得分:2)

这显然会给出超出范围的异常,因为您没有跟踪ab数组的长度。由于k = a + bab将始终小于k。因此例外。

当您应用此检查时,请记住复制剩余的项目,无论它们是a[]还是b[],都要将它们复制到c[]。看到这个 -

for(;i<a.length;i++)
    c[k++] = a[i++];

for(;j<b.length;b++)
    c[k++] = b[j++];

答案 1 :(得分:0)

您打算实现它的方式中的合并算法稍微详细一点,下面您将找到正确的实现:

public int[] merge(int a[], int b[]) {

    int i = 0, j = 0, k = 0;
    int m = a.length, n = b.length;
    int[] c = new int[m + n];

    // Merge to the end of one of the source arrays
    while (i < m && j < n) {
        if (a[i] <= b[j]) {
            c[k] = a[i];
            i++;
        } else {
            c[k] = b[j];
            j++;
        }
        k++;
    }

    // Determine which source array has elements remaining and
    // append those to the result array
    if (i < m) {
        for (int p = i; p < m; p++) {
            c[k] = a[p];
            k++;
        }
    } else {
        for (int p = j; p < n; p++) {
            c[k] = b[p];
            k++;
        }
    }

    return c;

}