排序 —— 基数排序

一、算法思想

基数排序的算法思想是“多关键字排序”,包括”最高位优先法“和”最低位优先法“两种方法

  • 最高位优先法(MSD):先对最高位关键字k1(如百位)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如十位)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列

  • 最低位优先法(LSD):从最低位关键字kd起进行排序,然后再对高一位的关键字排序,…依次重复,直至对最高位关键字k1排序后,便成为一个有序序列


二、算法过程

通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:

在这里插入图片描述
在上图中,首先将所有待比较数值统一为统一位数长度,接着从最低位开始,依次进行排序。

  1. 按照个位数进行排序。
  2. 按照十位数进行排序。
  3. 按照百位数进行排序。

排序后,数列就变成了一个有序序列。


三、算法性能分析

(1)时间复杂度

  • r d r_d 是关键字的基的个数,这里的基指的是构成关键字的符号,如关键字为数值时,构成关键字的符号就是 0~9 这些数字,以供由十个,即 r d = 10 r_d=10
  • n n 是序列中的关键字的个数
  • d d 是序列中的关键字的位数

基数排序每一趟都要进行“分配”和“收集

  • “分配”需要顺序扫描整一个数列,执行次数为 n
  • “收集”是对每一个桶进行的,桶的个数即关键字的基的个数,执行次数为 r d r_d
  • 关键字有多少位,就说明需要进行多少躺“分配”和“收集”,故需要将前述执行次数乘以 d

故时间复杂度为 O ( d ( r d + n ) ) O( d*(r_d+n)) ,而基数排序时间复杂度和初始序列无关,即平均时间复杂度、最好时间复杂度、最坏时间复杂度均为 O ( d ( r d + n ) ) O( d*(r_d+n))

(2)空间复杂度

因为每个桶实际上时一个队列,需要头尾指针,共有 r d r_d 个桶,所以需要 2 r d 2r_d 个存放指针的空间,因此是 O ( r d ) O(r_d)

(3)稳定性

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。

猜你喜欢

转载自blog.csdn.net/starter_____/article/details/94408679