408答疑
文章目录
五、归并排序、基数排序和计数排序
基数排序
定义
基数排序是一种很特别的排序算法,它不基于比较和移动进行排序,而基于关键字各位的大小进行排序。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。
基数排序过程
基数排序是基于多关键字的单逻辑排序方法,主要通过分发和回收两个过程完成排序。
关键字表示
假设长度为 n n n 的线性表中每个结点 a j a_j aj 的关键字由 d d d 元组 ( k j d − 1 , k j d − 2 , … , k j 1 , k j 0 ) (k_j^{d-1}, k_j^{d-2}, \ldots, k_j^1, k_j^0) (kjd−1,kjd−2,…,kj1,kj0) 组成,满足 0 ≤ k j i ≤ r − 1 ( 0 ≤ j < n , 0 ≤ i ≤ d − 1 ) 0 \leq k_j^i \leq r-1 \ (0 \leq j < n, 0 \leq i \leq d-1) 0≤kji≤r−1 (0≤j<n,0≤i≤d−1)。其中 k j d − 1 k_j^{d-1} kjd−1 为主位关键字, k j 0 k_j^0 kj0 为最次位关键字。
排序方法
为实现多关键字排序,通常有两种方法:
- 最高位优先(MSD)法:按关键字位权重递减依次逐层划分成若干更小的子序列,最后将所有子序列依次连接成一个有序序列。
- 最低位优先(LSD)法:按关键字位权重递增依次进行排序,最后形成一个有序序列。
排序过程
以 r r r 为基数的最低位优先基数排序的过程,在排序过程中,使用 r r r 个队列 Q 0 , Q 1 , … , Q r − 1 Q_0, Q_1, \ldots, Q_{r-1} Q0,Q1,…,Qr−1。基数排序的过程如下:
- 分配:开始时,把 Q 0 , Q 1 , … , Q r − 1 Q_0, Q_1, \ldots, Q_{r-1} Q0,Q1,…,Qr−1 各个队列置成空队列,然后依次考察线性表中的每个结点 a j ( j = 0 , 1 , … , n − 1 ) a_j \ (j=0, 1, \ldots, n-1) aj (j=0,1,…,n−1),若 a j a_j aj 的关键字 k j i = k k_j^i = k kji=k,就把 a j a_j aj 放进 Q k Q_k Qk 队列中。
- 收集:把 Q 0 , Q 1 , … , Q r − 1 Q_0, Q_1, \ldots, Q_{r-1} Q0,Q1,…,Qr−1 各个队列中的结点依次首尾相接,得到新的结点序列,从而组成新的线性表。
对 i = 0 , 1 , … , d − 1 i = 0, 1, \ldots, d-1 i=0,1,…,d−1,依次做一次分配和收集。
基数排序的中间过程分析
以最低位优先(LSD)法为例
排序过程概述
基数排序通常采用链式基数排序,假设对如下 10 个记录进行排序:
- → 278 → 109 → 063 → 930 → 589 → 184 → 505 → 269 → 008 → 083
每个关键字是 1000 以下的正整数,基数 r = 10 r = 10 r=10,在排序过程中需借助 10 个链队列,每个关键字由 3 位子关键字构成—— K 1 K 2 K 3 K^1K^2K^3 K1K2K3,分别代表百位、十位和个位,一共进行三趟“分配”和“收集”操作。
第一趟分配和收集
- 第一趟分配用最低位子关键字 K 3 K^3 K3 进行,将所有最低位子关键字(个位)相等的记录分配到同一个队列,然后进行收集操作。第一趟分配和收集后的结果如下图所示。
第二趟分配和收集
- 第二趟分配用次低位子关键字 K 2 K^2 K2 进行,将所有次低位子关键字(十位)相等的记录分配到同一个队列,然后进行收集操作。第二趟分配和收集后的结果如下图所示。
第三趟分配和收集
- 第三趟分配用最高位子关键字 K 1 K^1 K1 进行,将所有最高位子关键字(百位)相等的记录分配到同一个队列,然后进行收集操作。第三趟分配和收集后的结果如下图所示,至此整个排序结束。
性能分析
空间效率
- 一趟排序需要的辅助存储空间为 r r r(r 个队列: r r r 个队头指针和 r r r 个队尾指针),但以后的排序中会重复使用这些队列,所以基数排序的空间复杂度为 O ( r ) O(r) O(r)。
时间效率
- 基数排序需要进行 d d d 趟“分配”和“收集”操作。一趟分配需要遍历所有关键字,时间复杂度为 O ( n ) O(n) O(n);一趟收集需要合并 r r r 个队列,时间复杂度为 O ( r ) O(r) O(r)。因此基数排序的时间复杂度为 O ( d ( n + r ) ) O(d(n + r)) O(d(n+r)),它与序列的初始状态无关。
稳定性
- 每一趟分配和收集都是从前往后进行的,不会交换相同关键字的相对位置,因此基数排序是一种稳定的排序算法。
适用性
- 基数排序适用于顺序存储和链式存储的线性表。
九、参考资料
鲍鱼科技课件
b站免费王道课后题讲解:
网课全程班: