【发布时间】:2012-04-04 13:09:03
【问题描述】:
我目前正在尝试将合并排序算法从伪代码级别转录为 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 异常。 我哪里弄错了。
【问题讨论】:
-
考虑
a[a.length-1]b[0] 时会发生什么:遍历整个a数组,将i递增到a.length,然后尝试比较一个不存在的元素a的第一个元素为b。您需要主动检查一个数组的结尾,然后在发生这种情况时运行另一个数组。 -
@dlev 关于原因是正确的,尽管它根本不是边缘情况。无论发生什么,您都会先完成一个数组,而当这种情况发生时,您需要能够完成另一个数组的填充。
-
@MarkPeters 事实上,我并不是要暗示这是一个边缘案例。我只是想用一个“极端”的例子来说明这一点。
标签: java algorithm sorting merge mergesort