[アルゴリズム]基数ソートRadix Sort
4427 ワード
データを構成する基本要素(Radix)を用いてソートする.基数ごとにパケットを生成して分類し、パケット内でソートします.比較ソートの制限はO(nlogn)
=>基数ソートはnon-comparentsortでこの制限を超えることができます. 比較するデータ長が異なる場合、の効率は低下します. 安定ソート(安定) MSD:最大桁数からソートします.中間ソートの結果がわかります. LSD:最下位からソートします.ソートするデータの長さが異なる場合は、ビッグデータの桁数で計算します.
=>主にLSD用
=>並べ替えの場合は、大きな桁数を優先します.MSDは大きなビット数を先にソートし、次のビット数をソートするとソートされた順序が狂う可能性があります.そのため、ソートが行われているかどうかを確認する必要があります.そのため、より多くのメモリが必要です.コメントリンク 文字列、整数ソート可能 浮動小数点のような桁数がないと に並べ替えられない.完全な概要
詳細手順
キュー資料構造の0から9のBucketを準備します. のすべてのデータについて、データを最低桁数のBucket順に配置します. 0から順にbucketからデータを再取得します. で最も高い桁数を基準に、桁数を上げ、2番3番の手順を繰り返します. コード
時間の複雑さ
d:ソートする数値桁数、n:データ個数、k:範囲(最大値、固定10)
時間複雑度最適Ω(nk)平均値Θ(nk)最悪のO(nk)
=>
スペースの複雑さ: 注:リンク1
メモリンク2
=>基数ソートはnon-comparentsortでこの制限を超えることができます.
=>主にLSD用
=>並べ替えの場合は、大きな桁数を優先します.MSDは大きなビット数を先にソートし、次のビット数をソートするとソートされた順序が狂う可能性があります.そのため、ソートが行われているかどうかを確認する必要があります.そのため、より多くのメモリが必要です.コメントリンク
#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)
メモリンク2
Reference
この問題について([アルゴリズム]基数ソートRadix Sort), 我々は、より多くの情報をここで見つけました https://velog.io/@kji990607/기수-정렬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol