Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

計数ソート・基数ソート

比較に基づくソートの下限は Ω(nlog⁡n)\Omega(n \log n) だが、計数ソートと基数ソートは比較を使わないことで O(n)O(n) を達成する非比較ソート。値の範囲に制約がある場合に有効。

計数ソート(Counting Sort)

各値の出現回数を数え、累積カウントから各要素の最終位置を決定する。

計算量
時間計算量O(n+k)O(n + k)(kk は値の範囲)
空間計算量O(n+k)O(n + k)

特徴

  • 安定ソート

  • 値が整数で範囲 kk が小さい(k=O(n)k = O(n))場合に有効

  • k≫nk \gg n のとき非効率(例:n=10n=10、値域 [0,109][0, 10^9])

入力: [4, 2, 2, 8, 3, 3, 1]
出力: [1, 2, 2, 3, 3, 4, 8]
ランダム200件 (値域0-100): OK

基数ソート(Radix Sort)

数値を桁ごとに安定ソートを繰り返す。最下位桁から順に処理する LSD(Least Significant Digit)が一般的。

計算量
時間計算量O(d⋅(n+b))O(d \cdot (n + b))(dd: 桁数、bb: 基数)
空間計算量O(n+b)O(n + b)

特徴

  • 安定ソート

  • 値の範囲が広い整数(例:32bit)でも基数 b=256b=256、桁数 d=4d=4 で効率的

  • 各桁の内部ソートに計数ソートを使う

入力: [170, 45, 75, 90, 802, 24, 2, 66]
出力: [2, 24, 45, 66, 75, 90, 170, 802]
ランダム500件 (値域0-10^9): OK
32bit整数 500件 (基数256): OK

比較ソートとの計算量比較

アルゴリズム時間計算量安定in-place制約
計数ソートO(n+k)O(n+k)✓✗整数、k=O(n)k=O(n)
基数ソートO(d(n+b))O(d(n+b))✓✗整数
バケットソートO(n)O(n) 平均✓✗一様分布
マージソートO(nlog⁡n)O(n\log n)✓✗なし
クイックソートO(nlog⁡n)O(n\log n) 平均✗✓なし
ヒープソートO(nlog⁡n)O(n\log n)✗✓なし