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

JavaScriptで出現頻度の昇順に数値配列をソートする方法

本記事では、重複した数値を含む可能性のある数値配列を受け取り、出現回数(頻度)が少ない要素から順に並べ替えるJavaScript関数の作成方法を解説します。

具体的には、配列内の各要素が出現する回数をカウントし、頻度が低い要素ほど先頭に配置されるようにソートを行います。

要件の確認

例えば、入力配列が次のような場合を考えてみましょう。

const arr = [1,1,2,2,2,3];

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

const output = [3,1,1,2,2,2];

「3」は1回しか出現しないため最初に配置され、続いて2回出現する「1」、最後に3回出現する「2」が並びます。このように、頻度の昇順で要素が整列されていることが分かります。

実装コード

const arr = [1, 1, 2, 2, 2, 3];
const frequencySort = (arr = []) => {
    let map = {};
    for (let i = 0; i < arr.length; i++) {
        map[arr[i]] = (map[arr[i]] || 0) + 1;
    };
    return arr.sort((a,b) => map[a] - map[b] || b - a);
};
frequencySort(arr);
console.log(arr);

コードの解説

まず、空のオブジェクト map を用意し、forループを使って各数値の出現回数をカウントしていきます。(map[arr[i]] || 0) + 1 という記述により、まだ記録されていない数値は1からカウントを開始し、既に存在する数値は前回の値に1を加算します。

次に、Array.prototype.sort() メソッドに比較関数を渡して並べ替えます。比較関数内では、まず map[a] - map[b] によって両者の頻度差を評価し、頻度が異なる場合は出現回数の少ない方が先に来るよう制御しています。さらに || b - a の部分により、頻度が同一だった場合には値の大きい方が先頭側に配置されるフォールバック処理も組み込まれています。

出力結果

上記のコードを実行すると、コンソールには以下の結果が出力されます。

[ 3, 1, 1, 2, 2, 2 ]

このように、ハッシュマップによる頻度カウントとsortメソッドの比較関数を組み合わせるだけで、シンプルかつ効率的に頻度順ソートを実現できます。計算量は O(n log n) 程度に収まり、実用的なパフォーマンスが得られます。

  1. JavaScriptで配列を波状(ジグザグ)パターンに並べ替える方法

    問題数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成します。この関数は、並べ替え後の配列の要素が次のパターンに従うように並べ替える必要があります。arr[0] < arr[1] > arr[2] < arr[3]....このような並べ順は「波状ソート」や「ジグザグソート」と呼ばれることもあります。偶数番目のインデックスの要素は隣接する要素より小さく、奇数番目のインデックスの要素は隣接する要素より大きくなるように配置するのがポイントです。例として、関数への入力が次の場合を考えてみましょう。const arr = [1, 5, 1, 1, 6, 4];

  2. JavaScriptで配列を出現頻度の昇順に並べ替える方法

    問題数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。配列 arr には重複した要素が含まれている可能性があります。この関数では、出現回数が少ない要素から順に配列を並べ替えます。つまり、出現頻度の低い要素を先頭に配置し、頻度の昇順に沿って残りの要素を並べていきます。なお、出現回数が同じ要素が複数存在する場合は、それらを値の昇順(小さい順)に配置する必要があります。入力例const arr = [5, 4, 5, 4, 2, 1, 12];出力例[1, 2, 12, 4, 4, 5, 5]出力の解説数値「1」「2」「12」はそれぞれ1回しか出現しない