一、算法思想
基数排序的算法思想是“多关键字排序”,包括”最高位优先法“和”最低位优先法“两种方法
-
最高位优先法(MSD):先对最高位关键字k1(如百位)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如十位)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列
-
最低位优先法(LSD):从最低位关键字kd起进行排序,然后再对高一位的关键字排序,…依次重复,直至对最高位关键字k1排序后,便成为一个有序序列
二、算法过程
通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:
在上图中,首先将所有待比较数值统一为统一位数长度,接着从最低位开始,依次进行排序。
- 按照个位数进行排序。
- 按照十位数进行排序。
- 按照百位数进行排序。
排序后,数列就变成了一个有序序列。
三、算法性能分析
(1)时间复杂度
- 是关键字的基的个数,这里的基指的是构成关键字的符号,如关键字为数值时,构成关键字的符号就是 0~9 这些数字,以供由十个,即
- 是序列中的关键字的个数
- 是序列中的关键字的位数
基数排序每一趟都要进行“分配”和“收集”
- “分配”需要顺序扫描整一个数列,执行次数为 n
- “收集”是对每一个桶进行的,桶的个数即关键字的基的个数,执行次数为
- 关键字有多少位,就说明需要进行多少躺“分配”和“收集”,故需要将前述执行次数乘以 d
故时间复杂度为 ,而基数排序时间复杂度和初始序列无关,即平均时间复杂度、最好时间复杂度、最坏时间复杂度均为
(2)空间复杂度
因为每个桶实际上时一个队列,需要头尾指针,共有 个桶,所以需要 个存放指针的空间,因此是
(3)稳定性
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。