算法导论之线性时间排序(2)

计数排序是一种非比较排序算法,适用于数据属于一定区间内的整数。它通过统计每个元素出现的次数,来确定元素在输出数组的位置,实现线性时间复杂度的排序。该算法在k=O(n)时效果最佳,具有稳定性,即相同值的元素排序后保持原有顺序。
摘要由CSDN通过智能技术生成

计数排序文档



在前面所接触到的各种排序算法中:在排序的最终结果中,各元素的次序依赖于他们之间的比较。我们把这类排序算法称为比较排序。到目前为止,前面所接触到的排序算法都是比较排序(堆排序、快排、归并排序等)

计数排序假设输入数据都属于一个小区间内的整数。

计数排序与之前的排序算法的不同之处就在于它并不是比较排序算法。因此它的时间复杂度的下限也并不是之间接触到的比较排序算法的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)。

计数排序一个重要的性质就是它是稳定的,具有相同值的两个元素在输出数组中的次序和他们在输入数组中的次序相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值