我正在尝试实现这个版本的合并排序,如 Cormen 的算法介绍中所见。
public static void merge(int[] A, int p, int q, int r) {
int lengthOfLeftSubarray = q - p + 1;
int lengthOfRightSubarray = r - q;
int[] L = new int[lengthOfLeftSubarray + 1];
int[] R = new int[lengthOfRightSubarray + 1];
for(int i=0; i<lengthOfLeftSubarray; i++)
L[i] = A[p + i];
for(int i=0; i<lengthOfRightSubarray; i++)
R[i] = A[q + i];
L[lengthOfLeftSubarray] = -1;
R[lengthOfRightSubarray] = -1;
int i = 0, j = 0;
for(int k=p; k<r; k++) {
if(L[i] <= R[j]) {****
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}
}
public static void mergesort(int[] A, int p, int r) {
if(p < r){
int q = (p + r) / 2;
mergesort(A, p, q);
mergesort(A, q + 1, r);
merge(A, p, q, r);
}
}
public static void main(String[] args) {
int[] unsorted = {12, 16, 4, 2, 7, 6};
Sorting.mergesort(unsorted, 0, unsorted.length - 1);
System.out.println(Arrays.toString(unsorted));
}
我有两个问题:
- 书中提到了一张哨卡,它应该是某种特殊的值,可以放入一个数组中,不会干扰排序。我使用了 -1 ,因为我想不出一种使用infinite的方法,正如书中所建议的那样。谁能解释一下什么是哨兵?
- 代码在方法中抛出 ArrayOutOfBounds 异常
merge
,其中四颗星是 ( * *)。关于为什么会发生这种情况的任何想法?