C と Java の MergeSort アルゴリズム

最終更新: 6月2026
  • MergeSort は分割統治法を使用して再帰的にソートするため、大規模なセットで効率的です。
  • 時間の計算量: O(n log n)、Bubble や Selection などの二次アルゴリズムに比べて有利です。
  • 安定しています。重複の相対的な順序が保持されるため、最初の順序が重要な場合に便利です。
  • サブ配列ごとに追加のメモリが必要ですが、他の手法と組み合わせてパフォーマンスを最適化できます。
マージソートアルゴリズム

データのソートは、プログラミングとアルゴリズム分析における基本的なタスクです。利用できるソート手法は多数ありますが、最も効率的なものの 1 つは MergeSort アルゴリズムです。このアルゴリズムは、「分割統治」アプローチを使用して、要素のリストを再帰的にソートします。

この記事では、C言語とJava言語でマージソートアルゴリズムを実装することに焦点を当てます。このアルゴリズムの仕組みと、それを自身のプロジェクトでどのように活用できるかを段階的に解説します。また、マージソートの時間計算量についても説明し、他のソートアルゴリズムとのパフォーマンスを比較します。

C と Java の MergeSort アルゴリズム

マージソートアルゴリズムは、分割統治法を用いて項目のリストをソートします。この処理は、分割、統治、マージという3つの主要な段階で行われます。ここでは、このアルゴリズムをC言語とJava言語で実装する方法を見ていきましょう。

C でのマージソートの実装

以下は C での MergeSort アルゴリズムの実装です。

#include <stdio.h>

void merge(int arr[], int left[], int right[], int left_size, int right_size) {
    int i = 0, j = 0, k = 0;
    
    while (i < left_size && j < right_size) {
        if (left[i] <= right[j]) {
            arr[k] = left[i];
            i++;
        } else {
            arr[k] = right[j];
            j++;
        }
        k++;
    }
    
    while (i < left_size) {
        arr[k] = left[i];
        i++;
        k++;
    }
    
    while (j < right_size) {
        arr[k] = right[j];
        j++;
        k++;
    }
}

void mergeSort(int arr[], int size) {
    if (size < 2) {
        return;
    }
    
    int mid = size / 2;
    int left[mid];
    int right[size - mid];
    
    for (int i = 0; i < mid; i++) {
        left[i] = arr[i];
    }
    
    for (int i = mid; i < size; i++) {
        right[i - mid] = arr[i];
    }
    
    mergeSort(left, mid);
    mergeSort(right, size - mid);
    merge(arr, left, right, mid, size - mid);
}

int main() {
    int arr[] = {9, 5, 2, 7, 1, 8, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    mergeSort(arr, size);
    
    printf("Sorted array: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

この実装では、まず関数を定義する。 merge 2 つの順序付けられたサブ配列をメイン配列に結合する役割を果たします。そして関数 mergeSort 配列を小さなサブ配列に再帰的に分割し、関数を使用してソートします。 merge。最後に、関数 main、テスト配列を作成し、 mergeSort そして、画面上に整列した配置を表示します。

  生きた知性:それが何であるか、どのように機能するか、そしてなぜそれが重要なのか

Java での MergeSort の実装

それでは、Java で MergeSort アルゴリズムを実装する方法を見てみましょう。

public class MergeSort {
    public static void merge(int[] arr, int[] left, int[] right) {
        int i = 0, j = 0, k = 0;

        while (i < left.length && j < right.length) {
            if (left[i] <= right[j]) {
                arr[k] = left[i];
                i++;
            } else {
                arr[k] = right[j];
                j++;
            }
            k++;
        }

        while (i < left.length) {
            arr[k] = left[i];
            i++;
            k++;
        }

        while (j < right.length) {
            arr[k] = right[j];
            j++;
            k++;
        }
    }

    public static void mergeSort(int[] arr) {
        if (arr.length < 2) {
            return;
        }

        int mid = arr.length / 2;
        int[] left = new int[mid];
        int[] right = new int[arr.length - mid];

        System.arraycopy(arr, 0, left, 0, mid);
        System.arraycopy(arr, mid, right, 0, arr.length - mid);

        mergeSort(left);
        mergeSort(right);
        merge(arr, left, right);
    }

    public static void main(String[] args) {
        int[] arr = {9, 5, 2, 7, 1, 8, 3};

        mergeSort(arr);

        System.out.print("Sorted array: ");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

JavaでのMergeSortの実装では、関数の静的メソッドを使用します。 merge y mergeSort。 機能 merge C実装と同じタスクを実行し、関数 mergeSort サブ配列の分割と結合の同じロジックに従います。行事で main、テスト配列を作成し、 mergeSort ソートされた配列をコンソールに表示します。

MergeSort アルゴリズムの時間計算量はどれくらいですか?

MergeSort アルゴリズムの時間計算量は O(n log n) です。ここで、「n」はソートする配列の要素数を表します。これは、アルゴリズムの実行時間が「n」と「n」の 2 を底とする対数の積に比例して増加することを意味します。この複雑さにより、MergeSort は利用可能なソート アルゴリズムの中で最も効率的なものの XNUMX つになります。

MergeSortと他のソートアルゴリズムの比較

MergeSort は、データのソート効率に優れています。バブルソートや選択ソートなどの他の一般的なアルゴリズムと比較すると、マージソートは時間の計算量がはるかに優れています。バブルソートと選択ソートの時間計算量は O(n^2) ですが、マージソートの時間計算量は O(n log n) です。つまり、MergeSort は、効率の低いアルゴリズムよりも大量のデータをより効率的かつ高速に処理できるということです。

  構造化プログラミング: 基本概念と原則

よくある質問

1: 他のソートアルゴリズムではなく MergeSort を使用するのはなぜですか?

MergeSort は、効率性とパフォーマンスの点で他のソート アルゴリズムよりも好まれます。マージソートは、時間計算量が O(n log n) であるため、バブルソートや選択ソートなどの 2 次計算量を持つアルゴリズムよりも高速かつ効率的に大規模なデータセットをソートできます。さらに、MergeSort は安定したアルゴリズムであり、等しい値を持つ要素の相対的な順序を維持するため、特定のコンテキストでは重要になる場合があります。

2: プロジェクトで MergeSort を使用するのはいつですか?

大規模なデータ セットを効率的に並べ替える必要がある場合は、MergeSort の使用を検討してください。順序付けられていないアイテムのリストがあり、できるだけ短時間で並べ替えられたリストを取得したい場合は、MergeSort が最適なオプションです。ただし、MergeSort は実行中に追加のサブ配列を作成するため、他のソート アルゴリズムに比べて多くのメモリ領域が必要になる場合があることに注意してください。

3: MergeSort を使用することで何かデメリットはありますか?

MergeSort の欠点としては、追加のメモリが使用されることが挙げられます。アルゴリズムの実行中に、データを分割および結合するための追加のサブ配列が作成され、特に非常に大きなデータ セットを扱う場合には、メモリ要件が増加する可能性があります。ただし、ほとんどの場合、この欠点はアルゴリズムの効率と比較すると重要ではありません。

4: MergeSort は配列内の重複要素を処理できますか?

はい、MergeSort は配列内の重複する要素を処理できます。アルゴリズムは安定しており、等しい値を持つ要素の相対的な順序を維持します。これは、重複がある場合にアイテムの元の順序を維持したい場合に重要です。 MergeSort は、入力配列とソートされた配列の両方で重複する要素が同じ相対順序で表示されることを保証します。

  ショアのアルゴリズムのすべて: 機能、影響、課題

5: MergeSort アルゴリズムにバリエーションや改良点はありますか?

はい、MergeSort アルゴリズムにはいくつかのバリエーションと改良点があります。これらのバリエーションには、反復 MergeSort、サブ配列マージの最適化を備えた MergeSort、および MergeSort と挿入ソートなどの別のソート アルゴリズムを組み合わせて特定のケースでより優れたパフォーマンスを実現するハイブリッド MergeSort が含まれます。これらのバリアントは、特定の状況における MergeSort アルゴリズムのパフォーマンスと効率を向上させることを目指しています。

6: MergeSort やその他のソート アルゴリズムについて詳しくはどこで学べますか?

MergeSort やその他のソート アルゴリズムについて詳しく知りたい場合は、次のリソースを参照してください。

結論

この記事では、C および Java プログラミング言語における MergeSort アルゴリズムについて説明しました。この効率的なデータソートアルゴリズムを実装する方法を学び、その時間の複雑さについて説明しました。詳細な例と説明を通じて、C および Java で MergeSort がどのように機能するか、またそれを独自のプロジェクトにどのように適用できるかをしっかりと理解できるようになりました。

MergeSort は、大規模なデータ セットをソートするための強力なツールであり、時間の計算量が O(n log n) であるため、他の効率の低いソート アルゴリズムに比べて魅力的なオプションとなります。データを効率的かつ迅速に並べ替える必要がある場合は、MergeSort をアルゴリズムとして選択することを検討してください。

プロジェクトで MergeSort を試して、そのメリットを享受し、最適なデータ ソート パフォーマンスを実現しましょう。