[アルゴリズム]基数ソートRadix Sort


    データを構成する基本要素(Radix)を用いてソートする.基数ごとにパケットを生成して分類し、パケット内でソートします.
  • 比較ソートの制限はO(nlogn)
    =>基数ソートはnon-comparentsortでこの制限を超えることができます.
  • 比較するデータ長が異なる場合、
  • の効率は低下します.
  • 安定ソート(安定)
  • MSD:最大桁数からソートします.中間ソートの結果がわかります.
  • LSD:最下位からソートします.ソートするデータの長さが異なる場合は、ビッグデータの桁数で計算します.
    =>主にLSD用
    =>並べ替えの場合は、大きな桁数を優先します.MSDは大きなビット数を先にソートし、次のビット数をソートするとソートされた順序が狂う可能性があります.そのため、ソートが行われているかどうかを確認する必要があります.そのため、より多くのメモリが必要です.コメントリンク
  • 文字列、整数ソート可能
  • 浮動小数点のような桁数がないと
  • に並べ替えられない.
  • 完全な概要
  • 詳細手順




  • キュー資料構造の0から9のBucketを準備します.
  • のすべてのデータについて、データを最低桁数のBucket順に配置します.
  • 0から順にbucketからデータを再取得します.
  • で最も高い桁数を基準に、桁数を上げ、2番3番の手順を繰り返します.
  • コード
  • #include<iostream>
    #include<cstdlib>
    #include<ctime>
    #include<queue>
     
    #define MAX 100
    using namespace std;
     
    int Max_Value;
    int Arr[MAX];
    bool Flag[10001];
    queue<int> Q[10];
     
    void Print()
    {
        cout << "####################################################################################################################" << endl;
        int Cnt = 0;
        for (int i = 0; i < MAX; i++)
        {
            printf("%6d ", Arr[i]);
            Cnt++;
            if (Cnt == 20)
            {
                Cnt = 0;
                cout << endl;
            }
        }
        cout << "####################################################################################################################" << endl;
        cout << endl;
    }
     
    void Radix_Sort()
    {
        int Radix = 1;
        while (1)
        {
            if (Radix >= Max_Value) break;
            Radix = Radix * 10;
        }
        for (int i = 1; i < Radix; i = i * 10)
        {
            for (int j = 0; j < MAX; j++)
            {
                int K;
                if (Arr[j] < i) K = 0;
                else K = (Arr[j] / i) % 10;
                Q[K].push(Arr[j]);
            }
     
            int Idx = 0;
            for (int j = 0; j < 10; j++)
            {
                while (Q[j].empty() == 0)
                {
                    Arr[Idx] = Q[j].front();
                    Q[j].pop();
                    Idx++;
                }
            }
        }
    }
     
    int main(void)
    {
        srand((unsigned)time(NULL));
        for (int i = 0; i < MAX; )
        {
            Arr[i] = (rand() % 10000) + 1;
            if (Flag[Arr[i]] == false)
            {
                Flag[Arr[i]] = true;
                if (Max_Value < Arr[i]) Max_Value = Arr[i];
     
                i++;
            }
        }
        
        cout << "[ Initialize Array State ] " << endl;
        Print();
        Radix_Sort();
        cout << "[ After Sort Array State ] " << endl;
        Print();
     
        return 0;
    }

  • 時間の複雑さ
    d:ソートする数値桁数、n:データ個数、k:範囲(最大値、固定10)
    時間複雑度最適Ω(nk)平均値Θ(nk)最悪のO(nk)
    => O(d(n+K))

  • スペースの複雑さ:O(n+k)
  • 注:リンク1
    メモリンク2