コーメンによるアルゴリズムの紹介に見られるように、このバージョンのマージソートを実装しようとしています。
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));
}
私が持っている2つの問題があります:
- この本では、センチネル カードが言及されています。これは、並べ替えを妨げない、配列に入れるためのある種の特別な値であると想定されています。本で提案されているように、無限を使用する方法が思いつかなかったので、私は -1 を使用しました。センチネルとは何か説明できる人はいますか?
- コードは
merge
メソッドで ArrayOutOfBounds 例外をスローしています。4 つの星は ( * *) です。なぜこれが起こっているのかについてのアイデアはありますか?