计数排序文档
在前面所接触到的各种排序算法中:在排序的最终结果中,各元素的次序依赖于他们之间的比较。我们把这类排序算法称为比较排序。到目前为止,前面所接触到的排序算法都是比较排序(堆排序、快排、归并排序等)
计数排序假设输入数据都属于一个小区间内的整数。
计数排序与之前的排序算法的不同之处就在于它并不是比较排序算法。因此它的时间复杂度的下限也并不是之间接触到的比较排序算法的O(nlgn)。
计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数,利用这一信息,就可以直接把x放到它在输出数组的位置上了。例如,如果有17个元素小于x,则x就应该在第18个元素的位置上了,当有几个元素相同时,这一方案要略作修改,因为不能把他们放在同一位置上。
在计数排序算法的代码中,假设输入是一个数组A[1…n],A.length=n。我们还需要两个数组,B[1…n]存放排序的输出,C[0…k]提供临时存储空间。(k为数组A中最大元素的值)
计数排序的伪代码如下:
COUNTING-SORT(A,B,k):
Let C[0…k] be a new array
for i=0 to k
C[i]=0; //数组C的初始化
for j=1 to A.length
C[A[j]]= C[A[j]]+1;
//C[i] now contains the number of elements equals to i
for i=1 to k
C[i]=C[i]+C[i-1];
//C[i] now contains the number of elements less than equal to i
for j=A.length downto 1
B[C[A[j]]]=A[j];
C[A[j]]= C[A[j]]-1;
算法解析示意图如下:
实际工作中,当k=O(n)时,我们一般会采用计数排序,这时的运行时间是O(n)。
计数排序一个重要的性质就是它是稳定的,具有相同值的两个元素在输出数组中的次序和他们在输入数组中的次序相同。