聊聊计数排序

算法导论中文版P99说的很清楚,这篇文章说的也挺清楚
http://www.cppblog.com/shongbee2/archive/2009/04/24/80991.html
文中的图片用的就是算法导论书中的图片。
我再多嘴几句聊聊自己的体会与感想。
本质上计数排序类似于哈希排序,都是拿空间换时间,所以时间上O(n),很不错,但空间就不一定能保证。
我来逆向说一下计数排序的思路。如果现在手头需要排序一个数组A[n],将它排序成要得到的C[n]。最简单高效的就是以A[i]为key,从A[i]直接得出这个元素在C[n]中的位置。一个很显然的现象,就是如果对于某个A[i],你知道整个数组中小于等于它的元素有x个,那么可以肯定它应该排在第x位,C[x]位置上必然是A[i]。
于是你只要对每个A[i]都得出相应的x即可。一个辅助数组B,长度应该是A数组中元素大小的跨度,也就是从1到n的A[i]的范围。B[A[i]]记录A数组中小于等于A[i]的元素个数,也就是x,于是就解决了。
再补充几句,由于数组下标必须非负整数,对于B[A[i]],必须有A[i]非负整数,这也是计数排序的局限性。实际操作中如果碰到负整数,那么全部加上最小的负整数的绝对值,排序后再减回去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值