logo

基数ソート 📂アルゴリズム

基数ソート

アルゴリズム

桁数がkkに限られたnn個の自然数のデータが与えられているとする。すると、データは以下のアルゴリズムに従ってソートされ、その時間複雑性O(n)O (n)である。

i=1,,ki = 1 , \cdots , k番目の桁数で比較してソートする。

説明

**基数ソート(Radix Sort)**は、桁数の制限があるため浮動小数点のあるデータには適用できないが、データ間の比較をせずに比較ソートアルゴリズムの限界を超えて線形時間でデータをソートできる巧妙な方法である。

19081297721413 190 \\ 812 \\ 9 \\ 77 \\ 21 \\ 413 例えば、桁数がk=3k=3に限られたn=6n=6個のデータは36=183 \cdot 6 = 18回でソートが完了する。まずi=1i=1番目の桁でソートしてから、 190021812413077009 19 {\color{red}0} \\ 02 {\color{red}1} \\ 81 {\color{red}2} \\ 41 {\color{red}3} \\ 07 {\color{red}7} \\ 00 {\color{red}9} 次にi=2i=2番目の桁でソートし、 009812413021077190 0 {\color{red}0} 9 \\ 8 {\color{red}1} 2 \\ 4 {\color{red}1} 3 \\ 0 {\color{red}2} 1 \\ 0 {\color{red}7} 7 \\ 1 {\color{red}9} 0 最後にi=ki=k番目の桁でソートすると、 009021077190413812 \color{red}{0} 0 9 \\ {\color{red}0} 21 \\ {\color{red}0} 77 \\ {\color{red}1} 90 \\ {\color{red}4} 13 \\ {\color{red}8} 12 ここで注意すべき点として、kkは桁数という定数で与えられているためkn=O(n)kn = O(n)になるが、桁数がデータの数よりも多ければ当然O(n2)O(n^2)になる。このような場合は、基数ソートを使用する理由が全くなく、比較ソートアルゴリズムを使用した方が良い。

証明

戦略:上記のプロセスを理解したなら、証明をわざわざ見る必要はない。


00から99までの数をソートする際は、それぞれの数に合わせて集めてから再度結合すれば良い。00なら00同士を集め、11なら11同士を集め、…、99なら99同士を集めた配列を作り、順番に結合すればその桁に対してはソートが完了する。桁数kkまでこれを繰り返すので、総実行回数はkn=O(n)k n = O(n)になる。

コード

以下は基数ソートをJuliaで実装したものである。