一直以来就没有搞清楚基数排序(Radix Sort)和计数排序(Counting Sort)还有桶排序(Bucket Sort)的关系,今天wiki了一下,总算有了答案。
基数排序是利用排序关键字具有字典序特征的特点,对关键字进行分割,分若干轮子排序来达到最后使整个序列排好序的效果。至于子排序,可以以是其他的各种排序方法,基数排序仅仅指的是关键字分割这一思想。
计数排序顾名思义,就是开一个与关键字相匹配范围的表,对数据进行登记(即计数)。再通过按顺序遍历表,算出表中每个关键字序比它小的关键字有多少个。最后重新遍历原数据,根据处理过的表直接得出应该放的位置。注意表中记录的仅仅是数值,而没有把待排序的对象放进去。
这个算法有个特殊应用,如果需要排序关键字就是对象的全部,就可以在遍历表时,直接输出表中对应数值个相同对象就行了。
而桶排序是指将数据按关键字放入表中后,分别递归地对每个表内部进行排序,再按序遍历表输出。
基数排序的子排序算法常常使用计数排序实现(就是网上一搜一大把的那种开3个数组for3次,下标嵌套3层的那种)
有些资料上什么链表式基数排序又是怎么回事呢?
链表式是指子排序不是使用计数排序,而是一种叫鸽巢排序(Pigeonhole Sort)算法,其实就是桶排序省掉“递归地对每个表内部进行排序”步骤得到的算法,实际上递归的那部分被基数排序的多轮排序给完成了,使用了计数的基数排序本质上是拥有递归思想桶排序的一种特殊实现。
参考文献:
http://en.wikipedia.org/wiki/Radix_sort
http://en.wikipedia.org/wiki/Counting_sort
http://en.wikipedia.org/wiki/Pigeonhole_sort
http://en.wikipedia.org/wiki/Bucket_sort