Keito

© 2024 Keito

技術ブログとポートフォリオ

マージソートアルゴリズム

分割統治法による安定で効率的なソートアルゴリズムを学ぼう

O(n log n)
時間計算量(保証)
O(n)
空間計算量
中級
難易度
安定ソート
特性

🔧 実行設定

配列:
[38, 27, 43, 3, 9, 82, 10]
要素数:
7
🔗

アルゴリズムを実行してください

左側の設定パネルから条件を設定し、「マージソート実行」ボタンを押してください

💻 実装例(JavaScript)

function mergeSort(arr) {
    // ベースケース:要素が1個以下
    if (arr.length <= 1) {
        return arr;
    }
    
    // 配列を中央で分割
    const mid = Math.floor(arr.length / 2);
    const left = arr.slice(0, mid);
    const right = arr.slice(mid);
    
    // 再帰的にソートしてマージ
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    const result = [];
    let leftIndex = 0;
    let rightIndex = 0;
    
    // 両方の配列に要素がある間
    while (leftIndex < left.length && rightIndex < right.length) {
        if (left[leftIndex] <= right[rightIndex]) {
            result.push(left[leftIndex]); // 安定性を保つため等しい場合は左を優先
            leftIndex++;
        } else {
            result.push(right[rightIndex]);
            rightIndex++;
        }
    }
    
    // 残りの要素を追加
    return result
        .concat(left.slice(leftIndex))
        .concat(right.slice(rightIndex));
}

// 使用例
const unsortedArray = [38, 27, 43, 3, 9, 82, 10];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray); // [3, 9, 10, 27, 38, 43, 82]