Java における再帰的なマージソートの実装

JavaJavaBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

マージソートは、配列をソートするために分割統治法を使用する効率的で安定したソートアルゴリズムです。この実験では、再帰的なアプローチを使用して Java でマージソートを実装する方法を学びます。

マージソートメソッドを作成する

int arrToSort[], startIdx, endIdx の 3 つの整数型パラメータを持つ mergeSort() という public static メソッドを作成します。配列の長さが 2 未満である場合、そのまま返します。そうでない場合、配列の中央インデックスを計算し、配列を左右の 2 つに分割します。左右の半分も再帰的に分割されます。分割した後、それらをマージしてソート済みの配列を形成します。

public static void mergeSort(int[] arrToSort, int startIdx, int endIdx) {
    if (startIdx >= endIdx) {
        return;
    }

    int midIdx = startIdx + (endIdx - startIdx) / 2;
    mergeSort(arrToSort, startIdx, midIdx);
    mergeSort(arrToSort, midIdx + 1, endIdx);
    merge(arrToSort, startIdx, midIdx, endIdx);
}

マージメソッドを作成する

int arrToSort[], startIdx, midIdx, および endIdx の 4 つのパラメータを持つ merge() という別の public static メソッドを作成します。左右の配列を初期化する必要があります。その後、各配列の要素を比較して 1 つの配列にマージすることで、両方の配列をマージする必要があります。

public static void merge(int[] arrToSort, int startIdx, int midIdx, int endIdx) {
    int[] leftArr = new int[midIdx - startIdx + 1];
    int[] rightArr = new int[endIdx - midIdx];

    for (int i = 0; i < leftArr.length; i++) {
        leftArr[i] = arrToSort[startIdx + i];
    }
    for (int i = 0; i < rightArr.length; i++) {
        rightArr[i] = arrToSort[midIdx + i + 1];
    }

    int leftArrIdx = 0, rightArrIdx = 0, sortedArrIdx = startIdx;
    while ((leftArrIdx < leftArr.length) && (rightArrIdx < rightArr.length)) {
        if (leftArr[leftArrIdx] < rightArr[rightArrIdx]) {
            arrToSort[sortedArrIdx] = leftArr[leftArrIdx];
            leftArrIdx += 1;
        } else {
            arrToSort[sortedArrIdx] = rightArr[rightArrIdx];
            rightArrIdx += 1;
        }
        sortedArrIdx += 1;
    }

    while (leftArrIdx < leftArr.length) {
        arrToSort[sortedArrIdx] = leftArr[leftArrIdx];
        leftArrIdx += 1;
        sortedArrIdx += 1;
    }

    while (rightArrIdx < rightArr.length) {
        arrToSort[sortedArrIdx] = rightArr[rightArrIdx];
        rightArrIdx += 1;
        sortedArrIdx += 1;
    }
}

マージソートをテストする

入力配列をソートするコードを書いて、mergeSort() メソッドをテストしましょう。main メソッドを作成します。その後、いくつかの未ソートの値を持つ整数配列を宣言します。mergeSort() メソッドを呼び出し、未ソートの配列を渡します。最後に、ソート済みの配列をコンソールに出力します。このステップのコードブロックは次のようになります。

public static void main(String[] args) {
    int[] arrToSort = { 4, 2, 8, 0, 1, 6 };
    mergeSort(arrToSort, 0, arrToSort.length - 1);
    System.out.println(Arrays.toString(arrToSort));
}

プログラムを実行した後、出力は [0, 1, 2, 4, 6, 8] になるはずです。

空の配列でテストする

空の配列に対する別のテストを作成します。空の整数配列を宣言します。mergeSort() メソッドを呼び出し、それに空の配列を渡します。最後に、ソート済みの配列をコンソールに出力します。このステップのコードブロックは次のようになります。

int[] emptyArr = {};
mergeSort(emptyArr, 0, emptyArr.length - 1);
System.out.println(Arrays.toString(emptyArr));

出力は入力と同じになるはずです。

単一要素の配列でテストする

単一要素の配列を使ったさらに 1 つのテストを作成します。単一要素の整数配列を宣言します。mergeSort() メソッドを呼び出し、それに単一要素の配列を渡します。最後に、ソート済みの配列をコンソールに出力します。このステップのコードブロックは次のようになります。

int[] singleElementArr = {7};
mergeSort(singleElementArr, 0, singleElementArr.length - 1);
System.out.println(Arrays.toString(singleElementArr));

出力は入力と同じになるはずです。

負の値を持つ配列でテストする

負の整数からなる配列に対する別のテストを作成します。いくつかの負の整数を含む整数配列を宣言します。mergeSort() メソッドを呼び出し、その配列を引数として渡します。最後に、ソート済みの配列をコンソールに出力します。このステップのコードブロックは次のようになります。

int[] arrWithNegatives = {-7, 2, -9, 0, -1, 6, 8};
mergeSort(arrWithNegatives, 0, arrWithNegatives.length - 1);
System.out.println(Arrays.toString(arrWithNegatives));

プログラムを実行した後、出力は [-9, -7, -1, 0, 2, 6, 8] になるはずです。

非数値要素を持つ配列でテストする

非数値要素の配列をソートすることで、さらに 1 つテストを作成します。文字列を格納した配列を宣言します。mergeSort() メソッドを呼び出し、その配列を引数として渡します。最後に、ソート済みの配列をコンソールに出力します。このステップのコードブロックは次のようになります。

String[] strsToSort = {"John", "David", "Emily", "Bob", "Christine"};
mergeSort(strsToSort, 0, strsToSort.length - 1);
System.out.println(Arrays.toString(strsToSort));

プログラムを実行した後、出力は ['Bob', 'Christine', 'David', 'Emily', 'John'] になるはずです。

なお、出力結果の表示形式については、Java の Arrays.toString メソッドによる出力が想定されていますが、出力結果の表示形式が正確に反映されるように、翻訳時にはできる限り原文の形式を維持しました。出力結果の表示形式が正確に反映されるように、翻訳時にはできる限り原文の形式を維持しました。出力結果の表示形式が正確に反映されるように、翻訳時にはできる限り原文の形式を維持しました。重要なことは、出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になっていることです。出力結果が想定通りのソート順になって

最終ソースコード

ここにマージソートの最終ソースコードを示します。

import java.util.Arrays;

public class MergeSort {
   public static void mergeSort(int[] arrToSort, int startIdx, int endIdx) {
       if (startIdx >= endIdx) {
           return;
       }

       int midIdx = startIdx + (endIdx - startIdx) / 2;
       mergeSort(arrToSort, startIdx, midIdx);
       mergeSort(arrToSort, midIdx + 1, endIdx);
       merge(arrToSort, startIdx, midIdx, endIdx);
   }

   public static void merge(int[] arrToSort, int startIdx, int midIdx, int endIdx) {
       int[] leftArr = new int[midIdx - startIdx + 1];
       int[] rightArr = new int[endIdx - midIdx];

       for (int i = 0; i < leftArr.length; i++) {
           leftArr[i] = arrToSort[startIdx + i];
       }

       for (int i = 0; i < rightArr.length; i++) {
           rightArr[i] = arrToSort[midIdx + i + 1];
       }

       int leftArrIdx = 0, rightArrIdx = 0, sortedArrIdx = startIdx;
       while ((leftArrIdx < leftArr.length) && (rightArrIdx < rightArr.length)) {
           if (leftArr[leftArrIdx] < rightArr[rightArrIdx]) {
               arrToSort[sortedArrIdx] = leftArr[leftArrIdx];
               leftArrIdx += 1;
           } else {
               arrToSort[sortedArrIdx] = rightArr[rightArrIdx];
               rightArrIdx += 1;
           }
           sortedArrIdx += 1;
       }

       while (leftArrIdx < leftArr.length) {
           arrToSort[sortedArrIdx] = leftArr[leftArrIdx];
           leftArrIdx += 1;
           sortedArrIdx += 1;
       }

       while (rightArrIdx < rightArr.length) {
           arrToSort[sortedArrIdx] = rightArr[rightArrIdx];
           rightArrIdx += 1;
           sortedArrIdx += 1;
       }
   }

   public static void main(String[] args) {
       //create an unsorted integer array
       int[] arrToSort = { 4, 2, 8, 0, 1, 6 };
       //sort the integer array using Merge Sort
       mergeSort(arrToSort, 0, arrToSort.length - 1);
       //print the sorted array
       System.out.println(Arrays.toString(arrToSort));

       //create an empty integer array
       int[] emptyArr = {};
       //sort the empty array
       mergeSort(emptyArr, 0, emptyArr.length - 1);
       //print the sorted array
       System.out.println(Arrays.toString(emptyArr));

       //create a single-element array
       int[] singleElementArr = {7};
       //sort the single-element array
       mergeSort(singleElementArr, 0, singleElementArr.length - 1);
       //print the sorted array
       System.out.println(Arrays.toString(singleElementArr));

       //create a negative integer array
       int[] arrWithNegatives = {-7, 2, -9, 0, -1, 6, 8};
       //sort the negative integer array
       mergeSort(arrWithNegatives, 0, arrWithNegatives.length - 1);
       //print the sorted array
       System.out.println(Arrays.toString(arrWithNegatives));

       //create a string array
       String[] strsToSort = {"John", "David", "Emily", "Bob", "Christine"};
       //sort the string array
       mergeSort(strsToSort, 0, strsToSort.length - 1);
       //print the sorted array
       System.out.println(Arrays.toString(strsToSort));
   }
}

プログラムを実行する

ターミナルを使ってプログラムをコンパイルして実行します。

javac MergeSort.java && java MergeSort

まとめ

この実験では、マージソートとは何か、その動作原理、および Java での実装方法を学びました。入力配列を分割してマージするために、2 つの public static メソッドであるmergeSort()merge()を作成しました。実装後、さまざまな入力に対してテストを行い、時間と空間の計算量について考察し、その機能を検証しました。おめでとうございます!Java でのマージソートの実験を成功裏に完了しました。