计数排序是一种桶排序。假设我们像这样使用它:
- 设为
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)。
有谁知道如何做到这一点?还是不可能?