0

コーメンによるアルゴリズムの紹介に見られるように、このバージョンのマージソートを実装しようとしています。

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

1 に答える 1