カウントソートはバケツソートの一種です。次のように使用しているとしましょう。
A
ソートする配列にしましょう- 最大
k
要素とする bucket[]
バケットの配列にしましょう- 各バケットをリンクされたリストにします (開始ポインターと終了ポインターを使用)。
次に、疑似コードでは、ソートのカウントは次のようになります。
Counting-Sort (A[], bucket[], k)
1. Init bucket[]
2. for i -> 1 to n
3. add A[i] to bucket[A[i].key].end
4. for i -> 1 to k
5. concatenate bucket[i].start to bucket[0].end
6. bucket[0].end=bucket[i].end
7. copy bucket[0] to A
行ごとの時間の複雑さ:
1)O(1)で配列を初期化する方法(単純ではありませんが方法)があることは知っています
2,3) O(n)
4,5) O(k)
6) O(n)
これにより、O(k+n) の正味ランタイムが得られます。これは、k >> n の場合は Ω(n) であり、これは私たちにとって悪いことです。しかし、行 4、5 を変更して空のバケットをスキップできるとしたらどうでしょうか? このようにして、k が何であるかを無視して O(n) を持つことになります。
誰もこれを行う方法を知っていますか? それとも無理ですか?