链式基数排序: 用链表作存储结构的基数排序;基数排序不是基于“比较”的排序算法
1、关键词解释
- 最高位优先MSD ( Most Significant Digit first )
- 最低位优先LSD ( Least Significant Digit first)
- 假设长度为n的线性表中每个结点 aj 的关键字由d元组 ( k j d − 1 , k j d − 2 , k j d − 3 , . . . , k j 1 , k j 0 k_j^{d-1}, k_j^{d-2}, k_j^{d-3}, . . . , k_j^1, k_j^0 kjd−1,kjd−2,kjd−3,...,kj1,kj0) 组成。其中, 0 ≤ k j i ≤ r − 1 ( 0 ≤ j < n , 0 ≤ i ≤ d − 1 ) 0≤ k_j^i ≤ r-1 (0≤j
0≤kji≤r−1(0≤j<n,0≤i≤d−1) ,r称为“基数”- 最高位关键字(最主位关键字) k j d − 1 k_j^{d-1} kjd−1 最低位关键字(最次位关键字 ) k j 0 k_j^0 kj0
2、基数排序得到递减序列的过程如下,
- 初始化: 设置 r 个空队列, Q r − 1 , Q r − 2 , … , Q 0 Q_{r-1}, Q_{r-2},…, Q_0 Qr−1,Qr−2,…,Q0。按照各个关键字位 权重递增的次序(个、十、百),对 d 个关键字位分别做“分配”和“收集”
- 分配:顺序扫描各个元素,若当前处理的关键字位=x,则将元素插⼊ Qx 队尾
- 收集:把 Q r − 1 , Q r − 2 , … , Q 0 Q_{r-1}, Q_{r-2},…, Q_0 Qr−1,Qr−2,…,Q0各个队列中的结点依次出队并链接
3、基数排序擅长解决的问题:
①数据元素的关键字可以⽅便地拆分为 d 组,且 d 较小
②每组关键字的取值范围不⼤,即 r 较小
③数据元素个数 n 较大
4、
【12, 28, 20, 50, 48, 1, 5, 28】进行升序排序。
动态图展示:
以上gif动图制作,图像来自网站:VisuAlgo
1、空间复杂度 O(r)
需要 r 个辅助队列
2、时间复杂度
⼀趟分配O(n),⼀趟收集O(r),总共 d 趟分配、收集,总的时间复杂度 = O( d(n+r) ) (把关键字拆为d个部分;每个部分可能取得 r 个值)
3、稳定性:稳定
排序这一章结束!