计数排序不是基于比较的排序,如果待排序数据的范围在0~k之间,那么它的时间复杂度是O(k+n)的。
一、原理如下:
首先假设待排序数据的范围在0~k之间,而且都是整数。
定义一个辅助数组int[] C = new int[k+1]。
对于待排序数组source中任一个元素source[i](i>=0 && i<source.length)来说,如果能知道整个数组中小于、等于它的元素个数,那么就可以立刻知道它在排序后的数组(int[] result)中的位置。比如小于等于source[i]的元素个数是num个,那么它可以被放在数组result中的num-1处,即
result[num-1] = source[i];
这里需要注意,我没有说它一定在输出数组result的num-1处,因为有元素相等的情况,但可以这么说,它在输出数组result中的最大下标是num-1。
二、JAVA代码如下:
三、讨论
计数排序算法速度很快,因为它的时间复杂度是O(k+n),而基于交换的排序时间上限是nlg n。但是它的限制多,比如它只能排整形数组。而且当k较大,而数组长度n较小,即k>>n时,辅助数组C[k+1]的空间消耗较大。
当数组为整形,且k和n接近时, 可以用此方法排序。