web-dev-qa-db-ja.com

バケットソートと基数ソートの違いは何ですか?

バケットソートと基数ソートは密接な関係にあります。バケットソートはMSDからLSDに移行しますが、基数ソートは両方の「方向」(LSDまたはMSD)に移行できます。両方のアルゴリズムはどのように機能しますか、特にそれらはどのように違いますか?

44
Lazarus

RadixSortBucketSortの両方の初期パスはまったく同じです。要素は、最大の桁数に応じて、増分範囲のbuckets(またはbins)に配置されます(例:0-10、11-20、... 90-100)。数。

ただし、次のパスでは、BucketSortがこれらの「バケット」を順序付けし、1つの配列に追加します。ただし、RadixSortは、さらにソートせずにバケットを追加し、数字の2桁目(10の位)に基づいてバケットを「再バケット化」します。したがって、BucketSortは「密」配列の方が効率的ですが、RadixSortはまばらな(まあ、正確にはまばらではなく、間隔をあけた)配列をうまく処理できます。

41
Akash

バケットソートと基数ソートは、比較ソートではなく、一般的な考え方が似ているため、姉妹ソートアルゴリズムに似ています。また、両方とも実装が少し抽象的です。

基数ソート

  • 基数とはbase(binary、octal、decimalなど)を意味します。したがって、このソートは数値用です(ストリングにも使用されます)。これは、各要素Eがeのような場合に機能しますk... e2e1e、ここでe ある範囲内にあります。 (通常、0から10進数の0-9またはASCII文字)の0-255のような基数)

  • 次に、安定したサブソートアルゴリズムのkパスを使用して(それは安定している必要がありますまたはRadixソートは機能しません)、数値をソートします。このサブソートアルゴリズムは通常、カウントソートまたはバケットソートでもありますが、Radixソート自体はできませんです。

  • すべての数字をシャッフルする各パス(kから0または0からk)であるため、Most Significant DigitまたはLeast Significant Digitから開始できます。

  • 安定ソートアルゴリズムです。

バケットソート:

  • 配列を小さいグループまたはバケットに分割し、サブソートアルゴリズムまたはそれ自体への再帰呼び出しを使用してそれらを個別にソートしてから結果を結合します。たとえば、チームのバケツに追加してプレーヤーを並べ替え、次にジャージー番号または1〜30の範囲の数字を1〜10、11〜20、21〜30の3つのバケットに並べ替えます。

  • 結合ステップは簡単です(マージソートとは異なります)。各バケットの要素を元の配列にコピーするか、各バケットの先頭を前のバケットの末尾に結合するだけです(リンクリストの場合)

  • 基数/基数は、数字をソートする際のグループ/バケットのタイプ/インスタンスになります。したがって、MSD基数は、バケットソートの変更されたインスタンスと考えることができます。

  • バケットの並べ替えはin-placeではないですがstable並べ替えアルゴリズムです。ただし、バケットソートのいくつかのバリエーションは安定していない場合があります(安定していないサブソートアルゴリズムを使用する場合)

20
dev_ankit