算法导论中文版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]非负整数,这也是计数排序的局限性。实际操作中如果碰到负整数,那么全部加上最小的负整数的绝对值,排序后再减回去。
聊聊计数排序
最新推荐文章于 2024-09-11 00:16:09 发布