软考-软件设计师:排序算法-基数排序

介绍

  1. 首先确定 最大的数的位数。比如:最大数是一位数,即:个位;两位数,即:十位;三位数,即:百位

  2. 定义十个桶,编号 0-9(这是固定的)

  3. 先按照每个数的 个位数 排序,放入桶内,得到一个序列,桶清空;

  4. 依据上个序列,按照每个数的 十位数 排序,放入桶内,得到一个序列,桶清空;

  5. 以此类推,直到完成最大数的位数

例子

对序列 135,242,192,93,345,11,24,19 进行排序

首先确定最大的数的位数,最大的数 是 345,是 百位数,3位数,也就是说要执行 3轮

第1轮

定义十个桶,编号 0-9,按照每个数的 个位数 排序,放入桶内,如下图:

然后展开,桶清空,如下图:

第2轮

按照每个数的 十位数 排序,放入桶内,如下图:

然后展开,桶清空,如下图:

第3轮

按照每个数的 百位数 排序,放入桶内,如下图:

然后展开,桶清空,如下图:

时间复杂度

约为 O(n*k)

  • n:是数组长度
  • k:是最大数字的位数,表示总轮数

也可以写为:O(d∗(n+k))

  • k:是基数(十进制下 k=10),固定值,大O表示法可略
  • n:是数组长度
  • d:是最大数字的位数,表示总轮数

空间复杂度

在排序过程中仅需要一个元素的辅助空间用于数组元素的交互

空间复杂度为 O(n+k)

  • n:是数组长度
  • k:是最大数字的位数,表示总轮数

是否稳定

稳定,相同值的元素排序后相对位置不变

适用场景

适合处理整数、字符串等可以按 “位” 拆分的元素排序
不适合处理浮点数(需先转换为整数)或负数(需额外处理符号位)。


原文出处:/show_1GWwrx8Nmn9.html