1. 什么是基数?
例如:关键字483,个位:3;十位:8;百位:4;取值范围是 0 < k < 9,则基数r = 10, d = 3。
注:基数排序不是基于“比较”的排序算法。
2. 算法思路
初始化:将整个关键字拆分为d位(或“组”),按照各个关键字位权重递增的次序,做d趟“分配”和“收集”,若当前处理的关键字位可能取值r个值,则需要建立r个队列。
分配:顺序扫描各个元素,若当前处理的关键字位=x,则将元素插入Qx队尾。
收集:把Qr-1,Qr-2,… ,Q0各个队列中的结点依次出队并链接。
步骤如下:
原队列:
-
第一趟:按个位进行“分配”
-
第一趟:“收集”结束后,得到按“个位”递减排序的序列
-
第二趟:按十位进行“分配”
-
第二趟:“收集”结束后,得到按“十位”递减排序的序列
-
第三趟:按百位进行“分配”
-
第三趟:“收集”结束后,得到按“百位”递减排序的序列
- 空间复杂度:O®。
- 时间复杂度:O(d*(n+r))。
- 算法稳定性:稳定。
- 适用性:链表。
3. 适用场景
- 数据元素的关键字可以方便地拆分为d组,且d较小。(例如:学校学生的年龄,可拆分为年、月、日)
- 每组关键字的取值范围不大,即r较小。(例如:日可以取1-31,月取1-12,年取1990-2023)
- 数据元素个数n较大。(例如:学校学生10000名)