【きすうソート】

基数ソート とは?

💡 桁ごとに整列!比較しないのに並んじゃう魔法のソート
📌 このページのポイント
基数ソート(LSD方式) 元データ: 170 45 75 90 802 2 66 ①1の位: 17⓪ 9⓪ 80② 4⑤ 7⑤ 6⑥ ②10の位: 8⓪2 ⓪2 ④5 ⑥6 1⑦0 ⑦5 ⑨0 ③100の位: ⓪02 ⓪45 ⓪66 ⓪75 ⓪90 ①70 ⑧02 結果: 2 45 66 75 90 170 802 計算量: O(n × k) n=要素数, k=最大桁数 ※ 比較ソートの下限 O(n log n) を超えられる
基数ソート(LSD方式)のイメージ
ひよこ ひよこ

基数ソートって「比較しないソート」って聞いたけど、比較しないでどうやって並べるの?

ペンギン先生 ペンギン先生

いい質問!基数ソートは数値を桁ごとに分解して、1の位から順にバケット(箱)に振り分けるんだ。例えば 0〜9 の10個のバケットを用意して、1の位の値でまず振り分け、次に10の位、100の位…と繰り返す。全部の桁を処理し終わると自然にソートが完了するよ。

ひよこ ひよこ

具体的にはどんな流れになるの?

ペンギン先生 ペンギン先生

たとえば [170, 45, 75, 90, 802, 24, 2, 66] をソートするなら、まず1の位で振り分けると 170→90→802→2→24→45→75→66 の順になる。次に10の位で振り分けて、最後に100の位で振り分けると完成だよ。

ひよこ ひよこ

普通のソートより速いの?

ペンギン先生 ペンギン先生

データ次第だね。比較ソートの下限は O(n log n) だけど、基数ソートは O(n × k) で、k は最大桁数。桁数が小さいデータが大量にある場合は O(n) に近くなって圧倒的に速いよ。ただし桁数が多いデータだと逆に不利になることもあるんだ。

ひよこ ひよこ

どういう場面で使うと便利なの?

ペンギン先生 ペンギン先生

整数の大量ソート、郵便番号、IPアドレス、固定長の文字列なんかに向いてるよ。実際にデータベースエンジンや並列ソートでも使われることがあるんだ。

ひよこ ひよこ

LSD と MSD って聞いたことあるけど、何が違うの?

ペンギン先生 ペンギン先生

LSD(Least Significant Digit)は下の桁から処理する方式で、さっき説明したのがこれ。MSD(Most Significant Digit)は上の桁から処理して、途中で再帰的にグループを分割するよ。LSD のほうが実装がシンプルで安定ソートになるから一般的だね。

ひよこ ひよこ

GPU とかでも使われたりするの?

ペンギン先生 ペンギン先生

実はGPU上の並列ソートで基数ソートは超メジャーなんだ。NVIDIA の CUB ライブラリにも実装されていて、数十億要素のソートを高速にこなすよ。各桁の振り分け処理が並列化しやすいのが理由だね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「基数ソート」って出てきたら「桁ごとに振り分けて並べる比較しないソート」と思えればだいたいOK!
📖 おまけ:英語の意味
「Radix Sort」 = 基数(桁の底)で並べ替え
💬 Radixはラテン語で「根」や「基」の意味。数の「基数」(10進なら10)に由来するよ
← 用語集にもどる