public static void main(String[] args) {
int[] test = {5,4,3,5,7,5,1,5,96};
System.out.print("Before: ");
printList(test);
mergeSort(test, 1, test.length);
//System.out.print("After: ");
//printList(test);
}
public static void printList(int[] test){
for (int i= 0; i < test.length; i++){
System.out.print(test[i] + " ");
}
System.out.println();
}
public static void merge(int[] A, int p, int q, int r){
int n1 = q - p + 1;
int n2 = r - q;
int[] L = new int[n1];
int[] R = new int[n2];
for(int i = 1; i <= n1; i++){
L[i] = A[p+i-1];
}
for (int j = 1; j <= n2; j++){
R[j] = A[q+j];
}
int i = 1;
int j = 1;
for (int k=p; i <= r; i++){
if (i > n1){
A[k] = R[j];
j++;
}
else if (j > n2){
A[k] = L[i];
i++;
}
else 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);
}
}
私はテスト配列にマージソートを実装しようとしていますが、なぜこれでArrayIndexOutOfBoundsExceptionエラーが発生するのかわかりません。割り当ては、マージソートコードを変更して、検索時にセンチネルを使用しないようにすることです。Merge Sort for Javaの実装に問題があります
Before: 5 4 3 5 7 5 1 5 96
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Lab1_2.merge(Lab1_2.java:28)
at Lab1_2.mergeSort(Lab1_2.java:61)
at Lab1_2.mergeSort(Lab1_2.java:59)
at Lab1_2.mergeSort(Lab1_2.java:59)
at Lab1_2.mergeSort(Lab1_2.java:59)
at Lab1_2.main(Lab1_2.java:8)
これはエラーメッセージです。
だろうか?完全なスタックトレースを表示してください – Li357
私はそれを追加しました。 – willielf
私はなぜあなたが1で配列ループを開始し、それが等しくなるまで行くのが好奇妙です。それはループが配列内の要素の外に出てプログラムがそれにアクセスしようとするとエラーが発生します – Li357