我目前正在尝试将一个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异常。 我在哪里弄错了。
答案 0 :(得分:2)
这显然会给出超出范围的异常,因为您没有跟踪a
和b
数组的长度。由于k = a + b
,a
和b
将始终小于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;
}