マージソート | ソートアルゴリズム | アルゴリズムをはじめから

スポンサーリンク
スポンサーリンク

マージソートアルゴリズムの解説

マージソートとは?

マージソートは、分割統治法(Divide and Conquer)を利用した効率的なソートアルゴリズムです。リストを小さな部分に分割し、個々の部分をソートしてから、それらを結合(マージ)して全体を整列させます。計算量は安定しており、最悪のケースでも O(n log n) です。この安定性と効率性から、特に大規模なデータセットに対して非常に有効です。

マージソートのステップ

  1. リストを半分に分割します。分割が不可能になるまでこの操作を繰り返します。
  2. それぞれの分割された部分を再帰的にソートします。
  3. ソートされた部分を2つずつマージし、1つのリストに結合します。
  4. すべての部分がマージされ、完全に整列されたリストが得られます。

マージソートのステップごとの変化

ステップ リストの状態 アクション
初期状態 [5, 2, 9, 1, 5, 6]
1 [5, 2, 9] + [1, 5, 6] リストを分割
2 [5, 2] + [9] + [1, 5] + [6] さらに分割
3 [2, 5] + [9] + [1, 5] + [6] 分割されたリストをソート
4 [2, 5, 9] + [1, 5, 6] ソート後の部分をマージ
5 [1, 2, 5, 5, 6, 9] 全体をマージ

マージソートのJavaScript実装


// マージソートのJavaScript実装
function mergeSort(arr) {
    if (arr.length <= 1) return arr;

    const mid = Math.floor(arr.length / 2);
    const left = mergeSort(arr.slice(0, mid));
    const right = mergeSort(arr.slice(mid));

    return merge(left, right);
}

function merge(left, right) {
    let result = [];
    while (left.length && right.length) {
        if (left[0] < right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }
    return result.concat(left, right);
}

let array = [5, 2, 9, 1, 5, 6];
console.log("ソート前:", array);
console.log("ソート後:", mergeSort(array));

マージソートのPython実装

# マージソートのPython実装
def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    return merge(left, right)

def merge(left, right):
    result = []
    while left and right:
        if left[0] < right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    return result + left + right

array = [5, 2, 9, 1, 5, 6]
print("ソート前:", array)
print("ソート後:", merge_sort(array))

さらに詳しく

マージソートの大きな特徴は、計算量が安定して O(n log n) であることです。これは、データを再帰的に分割してソートするため、各ステップで n 回の比較が行われ、全体として log n ステップの処理が必要であるためです。このため、最悪計算量でも O(n log n) を維持できる非常に効率的なアルゴリズムです。

また、比較回数はリストの長さ n に比例しており、各ステップで n 回の比較が行われます。しかし、マージソートの欠点としては空間計算量が挙げられます。新たにリストを作成しながらマージを行うため、追加のメモリを必要とし、空間計算量は O(n) です。

まとめ

マージソートは、計算量が O(n log n) であり、最悪のケースでも効率よく動作するため、大規模データのソートに適しています。しかし、空間計算量が O(n) である点には注意が必要です。特に、メモリが限られている環境では、他のソートアルゴリズムと比較して検討することが求められます。