线性时间排序算法-基数排序

在上一篇博客中,讲到计数排序的稳定性非常重要,主要可以体现在基数排序中(?)。这一篇,就来分析一下基数排序。 看《算法导论》中的图:           对329,457,657,839,436,720,355几个数字进行排序,使用基数排序的方法,从最低有效位开始,即首先根据个位排序,得到720,355,436,457,657,329,839。十位、百位以此类推。最终得到排序的结果。对于基数排序,待排的数字必须都是符号相同的,全为正或者全为负。而且,更重要的,要能够从最低有效位开始对齐,高位没有,则补0即可。如果有的是小数,有的是整数,则无法直接使用基数排序。 java实现代码如下:               排序函数接收两个参数,待排数组arr和数字位数r。算法中,每一位排序使用的算法都是计数排序。代码不做过多解释,现在对基数排序的应用场景,体会并不深刻。在使用中有所体会时,会不断补充到博客中。在上图的代码中,计算每一位的时候,(x / p % 10)进行了两轮,主要是为了能将计数数组对应到原来的待排数组arr。这里有一个道理,如果一个结构,不好直接转化为另一个,那么就将它们同时转化为一个中间的结构。计算出每一位的值,就相当于一个中间结构的过程。 对于排序方法的选择,主要根据两点:
  1. 底层机器实现的特性
  2. 待排序的数据集合
根据这两点,在实际应用中选用不同的排序算法,比如说,如果内存比较紧张时,可以采用快速排序。如果内存很大,可以采用桶排序。
对于桶排序,我在学习的过程中,发现好多博客都和基数排序混淆了。在此声明一下,基数排序和桶排序是不一样的。对于计数排序而言,我们假设待排数据是由小范围的整数组成的,而对于桶排序而言,则是数据分布比较均匀。有关桶排序详细会在后文介绍。
【引用】
《算法导论》

posted on 2011-12-26 21:43  sing1ee  阅读(249)  评论(0)    收藏  举报