计数排序是一种基于特定范围之间的键的排序技术。它通过计算具有不同键值(散列类型)的对象的数量来工作,然后做一些算术来计算每个对象在输出序列中的位置。
计数排序的特点
- 计数排序对数据进行假设,例如,它假设值将在 0 到 10 或 10 - 99 等范围内,计数排序所做的另一个假设是输入数据都是实数。
- 与其他算法不同的是,此排序算法不是基于比较的算法,它对临时计数数组中的值进行散列处理并使用它们进行排序。
- 计数排序使用一个临时数组,使其成为非就地(in place)算法
举个例子
- 为简单起见,我们考虑 0 到 9 范围内的数据。
- 输入数据: {1, 4, 1, 2, 7, 5, 2}
- 取一个计数数组来存储每个唯一对象的数量。
- 遍历原始数组,并将每个元素的计数存储到计数数组中
- 在这个例子中,计数数组中每个唯一元素的计数如下所示:
- 索引:0 1 2 3 4 5 6 7 8 9
- 计数:0 2 2 0 1 1 0 1 0 0
- 然后对计数数组进行累加,使每个索引处的每个位置的值都等于先前计数的总和。
- 索引:0 1 2 3 4 5 6 7 8 9
- 计数:0 2 4 4 5 6 6 7 7 7
- 计数数组中的元素便是最初数组中与其对应的元素在输出数组中的索引+1
- 最后我们逆向遍历原始数组,并根据其对应的计数值将元素放置到结果数组的对应索引处,再将其对应的计数值 -1
注意:
时间复杂度: O(n),其中 n 是元素的总数
辅助空间: O(n)
其他特点:
- 如果输入数据的范围不明显大于要排序的对象数,则计数排序是有效的。考虑输入序列在范围 1 到 10K 之间并且数据为 10、5、10K、5K 的情况。
- 它不是基于比较的排序。它的运行时间复杂度为 O(n),空间与数据范围成正比。
- 计数排序的实现是基于我们对要排序的数的一些假设。
- 它通常把计数排序用作另一个排序算法(如基数排序)的子程序。
- 计数排序使用部分散列来计算 O(1) 中数据对象的出现次数。
- 计数排序也可以扩展到负输入。
- 计数排序不是一个稳定的排序算法,但是可以通过一些更改使其稳定。
代码实现下载链接:
(包含各种语言:C语言、Python、Java、C++等均有示例)
免费资源下载:Counting Sort