カウントソートは、配列の要素を線形時間でソートするために使用されるソートアルゴリズムです。
通常、整数配列のソートにはカウントソートを使用します。
カウントソートは安定した非比較アルゴリズムである。
非比較型ソートアルゴリズムは、ソートされる要素間の比較を行わずにソートを実行します。
安定したソートアルゴリズムでは、ソートされた配列の中で同じ値を持つ要素の相対的な順序が保持されます。
つまり、元の配列における2つの同じ値の要素の相対的な並び順は、ソート後の配列における相対的な並び順と同じになるのです。
カウントソートはインプレースアルゴリズムではなく、入力配列の要素を並べ替えるために補助配列を使用します。
- カウントソートはどのように動作するのでしょうか?
- カウントソートのPython実装
- Counting Sort アルゴリズムの複雑さ
カウントソート – Pythonの実装
さて、それではPythonでCounting Sortを実装してみましょう。
C = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # Count array
# indices: 0 1 2 3 4 5 6 7 8 9
上記のコードを実行すると、以下のような出力が得られます。
コード偽
カウントソートアルゴリズムの複雑さ
Counting Sort アルゴリズムは単純な for ループと while ループのみを使用し、複雑な再帰処理やサブルーチンコールを一切行わないため、その複雑さの解析は非常に簡単です。
複雑さの解析に入る前に、入力配列の長さを n
とし、入力配列の最大要素の値を k
とします。
時間的複雑性
アルゴリズムの最初のステップは、count 配列を初期化するために入力配列を n 回反復するので、その計算量は O(n) です。
第2段階は、各要素の累積和を計算するために count を k 回反復するので、計算量は O(k) である。
第3段階は、計数配列に基づいてソートを行うので、whileループを n
回繰り返さなければならず、その計算量はO(n)である。
まとめると、カウントソートアルゴリズムの時間計算量は O(n+k) となります。
空間複雑性
カウントソートは、長さ n
の入力配列と出力配列、および長さ (k+1)
のカウント配列 1 つを使用します。
したがって、このアルゴリズムが使用する総スペースは O(n+k) となります。
結論
全体として、カウントソートは偉大で効率的、かつシンプルなソートアルゴリズムである。
理想的な状況では、理解や学習が本当に簡単ですが、それでも線形複雑性を維持することに成功しています。
本当の問題は、最大の要素 k
の値が入力配列の要素数 n
を超えるときに発生します。
kが
n²に近づくと、カウントソートの時間計算量は
O(n²)` に近づきます。
これは、ソートアルゴリズムとしては恐ろしい時間計算量です。
したがって、入力配列の値の範囲が大きい場合には、 カウントソートを使うことは推奨されません。
理想的には,値の範囲が小さい整数配列のソートや, Radix Sort などの他のソートアルゴリズムのサブルーチンとして, カウントソートを利用することです.そうすることで、カウントソートの可能性を最大限に生かしつつ、最適とは言えない使用例をすべて回避することができるようになります。