数据结构-排序(九)基数排序

数据结构-排序(九)基数排序

数据结构-排序(九)基数排序_第1张图片

1、算法思想

链式基数排序: 用链表作存储结构的基数排序;基数排序不是基于“比较”的排序算法

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 kjd1,kjd2,kjd3,...,kj1,kj0) 组成。其中, 0 ≤ k j i ≤ r − 1 ( 0 ≤ j < n , 0 ≤ i ≤ d − 1 ) 0≤ k_j^i ≤ r-1 (0≤j0kjir1(0j<n,0id1),r称为“基数”
  • 最高位关键字(最主位关键字) k j d − 1 k_j^{d-1} kjd1 最低位关键字(最次位关键字 ) k j 0 k_j^0 kj0

2、基数排序得到递减序列的过程如下,

  1. 初始化: 设置 r 个空队列, Q r − 1 , Q r − 2 , … , Q 0 Q_{r-1}, Q_{r-2},…, Q_0 Qr1,Qr2,,Q0。按照各个关键字位 权重递增的次序(个、十、百),对 d 个关键字位分别做“分配”和“收集”
  2. 分配:顺序扫描各个元素,若当前处理的关键字位=x,则将元素插⼊ Qx 队尾
  3. 收集:把 Q r − 1 , Q r − 2 , … , Q 0 Q_{r-1}, Q_{r-2},…, Q_0 Qr1,Qr2,,Q0各个队列中的结点依次出队并链接

3、基数排序擅长解决的问题:

①数据元素的关键字可以⽅便地拆分为 d 组,且 d 较小

②每组关键字的取值范围不⼤,即 r 较小

③数据元素个数 n 较大

4、

【12, 28, 20, 50, 48, 1, 5, 28】进行升序排序。
数据结构-排序(九)基数排序_第2张图片
动态图展示:

以上gif动图制作,图像来自网站:VisuAlgo

二、算法效率分析

1、空间复杂度 O(r)

需要 r 个辅助队列

2、时间复杂度

⼀趟分配O(n),⼀趟收集O(r),总共 d 趟分配、收集,总的时间复杂度 = O( d(n+r) ) (把关键字拆为d个部分;每个部分可能取得 r 个值)

3、稳定性:稳定

排序这一章结束!

你可能感兴趣的:(C/C++数据结构,数据结构,排序算法,算法,c语言)