计数排序原理和JAVA实现

计数排序不是基于比较的排序,如果待排序数据的范围在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接近时, 可以用此方法排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值