JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで2つのソート済み配列をマージして、結果のソート済み配列を作成する方法

はじめに

本記事では、2つのソート済み(昇順に並べ替えられた)数値配列を受け取り、それらをマージして1つのソート済み配列として返すJavaScript関数の実装方法を解説します。

問題の概要

例えば、次の2つの配列が与えられたケースを考えてみましょう。

const arr1 = [2, 6, 6, 8, 9];
const arr2 = [1, 4, 5, 7];

この場合、期待される出力は以下の通りです。

const output = [1, 2, 4, 6, 6, 7, 8, 9];

実装のポイント

ここで紹介する手法では、新しい配列を用意する代わりに、arr1 の末尾から大きい値を詰めていくアプローチを採用しています。両方の配列がすでにソートされているため、それぞれの末尾要素を比較しながら、大きい方を結果の末尾へ配置していくことで、追加のメモリをほとんど使わずにマージできます。

サンプルコード

const arr1 = [2, 6, 6, 8, 9];
const arr2 = [1, 4, 5, 7];
const mergeSortedArrays = (arr1 = [], arr2 = []) => {
    let m = arr1.length;
    let n = arr2.length;
    let currentIndex = m + n;
    const checkNum1HasLargerNumber = (a, b) => {
        if (a < 0) {
            return false;
        };
        if (b < 0) {
            return true;
        };
        return arr1[a] >= arr2[b];
    };
    m -= 1;
    n -= 1;
    while (currentIndex--) {
        let hasNums1LargerNumber = checkNum1HasLargerNumber(m, n);
        arr1[currentIndex] = hasNums1LargerNumber ? arr1[m] : arr2[n];
        if (hasNums1LargerNumber) {
            m -= 1;
        } else {
            n -= 1;
        }
    };
};
mergeSortedArrays(arr1, arr2);
console.log(arr1);

コードの解説

  • mn は、それぞれ arr1・arr2 における現在の比較対象インデックスを表します。
  • currentIndex は、結果となる配列の末尾から順に値を書き込んでいく位置です。
  • 補助関数 checkNum1HasLargerNumber は、arr1 の末尾要素が arr2 の末尾要素以上かどうかを判定します。片方の配列の処理が完了(インデックスが負)した場合は、もう一方の配列の残りをそのままコピーします。
  • このアルゴリズムの計算量は O(m + n) で、余分な配列を作らないため非常に効率的です。

実行結果

コンソールには以下のように出力されます。

[
    1, 2, 4, 5, 6,
    6, 7, 8, 9
]
  1. C#でソート済みの2つの配列をリストにマージする方法

    C#では、ソート済みの2つの配列を1つのリストに簡単にマージ(結合)することができます。この記事では、基本的な手順とサンプルコードを使って、その方法をわかりやすく解説します。 マージの手順 まず、マージ対象となる2つのソート済み配列を用意します。以下はその例です。 int[] array1 = { 1, 2 }; int[] array2 = { 3, 4 }; 次に、List<int> のインスタンスを作成し、forループを使って両方の配列の要素を交互にリストへ追加していきます。 var list = new List<int>(); for (int i

  2. C#で2つのソート済み配列を1つにマージする方法【初心者向け解説】

    C#では、複数の配列を1つの配列に結合(マージ)することができます。本記事では、2つのソート済みの整数型配列を用意し、それらを3つ目の配列に順番にコピーしてマージする基本的な方法を、サンプルコードと実行結果とともにわかりやすく解説します。 マージする2つの配列を定義する まず、マージしたい2つの配列を宣言します。ここでは、それぞれ5つの要素を持つ整数型配列 arr1 と arr2 を用意します。 int[] arr1 = new int[5] { 5, 15, 25, 30, 47 }; int[] arr2 = new int[5] { 55