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

JavaScriptでバケットソートを実装する方法を解説!サンプルコード付き

バケットソート(Bucket Sort)は、サイズnの配列を、特定の値の範囲を持つk個の「バケット(bucket)」と呼ばれるグループに分割することで動作するソートアルゴリズムです。

その後、各バケットは別のソートアルゴリズムを使って個別に整列されます。この際、入力データの規模に応じて最適なソートアルゴリズムを選択できるのが特徴です。

このアルゴリズムの手順は以下のように説明できます。

アルゴリズムの流れ

1. 初期の bucketSort 関数を作成する
2. i、min、max、バケットサイズ用の変数を用意する
3. 最小値と最大値を求める
4. バケットの数を決定する
5. 各値を適切なバケットへ振り分ける
6. 各バケット内をソートする

実装例

実際のコードは次のようになります。

const arr = [32, 6, 34, 4, 78, 1, 6767, 4, 65, 34, 879, 7];
const bucketSort = arr => {
    if (arr.length === 0) {
        return arr;
    }
    let i,
    minValue = arr[0],
    maxValue = arr[0],
    bucketSize = 5;
    arr.forEach(function (currentVal) {
        if (currentVal < minValue) {
            minValue = currentVal;
        } else if (currentVal > maxValue) {
            maxValue = currentVal;
        }
    })
    let bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
    let allBuckets = new Array(bucketCount);
    for (i = 0; i < allBuckets.length; i++) {
        allBuckets[i] = [];
    }
    arr.forEach(function (currentVal) {
        allBuckets[Math.floor((currentVal - minValue) / bucketSize)].push(currentVal);
    });
    arr.length = 0;
    allBuckets.forEach(function(bucket) {
        insertion(bucket);
        bucket.forEach(function (element) {
            arr.push(element)
        });
    });
    return arr;
}
const insertion = arr => {
    let length = arr.length;
    let i, j;
    for(i = 1; i < length; i++) {
        let temp = arr[i];
        for(j = i - 1; j >= 0 && arr[j] > temp; j--) {
            arr[j+1] = arr[j];
        }
        arr[j+1] = temp;
    }
    return arr;
};
console.log(bucketSort(arr));

実行結果

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

[
    1, 4, 4, 6,
    7, 32, 34, 34,
    65, 78, 879, 6767
]

コードのポイント

この実装では、まず配列全体から最小値と最大値を取得し、その差分をもとに必要なバケット数を計算しています。各要素は (currentVal - minValue) / bucketSize の計算によって、どのバケットに入るかが決まります。

最後に、各バケット内の要素を挿入ソート(insertion sort)で整列し、すべてのバケットを先頭から順に連結することで、完全にソートされた配列が完成します。

  1. JavaScriptで基数ソート(ラディックスソート)を実装する方法

    基数ソート(ラディックスソート)は、整数を「桁」の値に基づいてバケットへ振り分けることで整列を行うアルゴリズムです。クイックソートやマージソートのような比較ベースのソートとは異なり、数値同士を直接比較するのではなく、一の位・十の位・百の位といった桁ごとに段階的に並べ替えていく点が大きな特徴です。ここでいう「基数」とは、対象となる値がどの記数法に基づいているかを表すものです。一般的な10進数の場合、基数は10となり、各ステップでは0〜9までの10個のバケットが用意されます。基数ソートの基本的な流れ配列の中から最大値を求め、必要な桁数を把握します。下位の桁(一の位)から順に、各数値をその桁の値に応

  2. JavaScriptのsort()メソッドとは?配列ソートの基本と比較関数の使い方を解説

    JavaScriptのsort()メソッドは、配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並べ替えの基準に加え、昇順・降順も自由に指定できます。デフォルトでは要素が文字列として比較され昇順にソートされますが、比較関数を渡すことで任意の順序を実現できます。 なお、sort()は元の配列そのものを変更する「破壊的メソッド」である点にも注意しましょう。元の配列を保持したい場合は、スプレッド構文([...arr])などで事前にコピーしておくのが安全です。 コード例 以下は、sort()メソッドを使って配列をソートするシンプルなサンプルコードです。 <!DO