基数排序算法 (附 Python/Java/C/C++ 程序)

2025年5月20日 | 10 分钟阅读

基数排序的过程类似于按字母顺序对学生姓名进行排序。在这种情况下,由于英文字母表中有 26 个字母,因此形成了 26 个基数。在第一轮中,学生姓名根据其姓名的首字母升序分组。之后,在第二轮中,他们的姓名根据其姓名的第二个字母升序分组。这个过程会一直持续,直到我们得到排序好的列表。

算法

基数排序的步骤

第 1 步: 识别输入数组中的最大数。

第 2 步: 找出最大数有多少位。这个位数决定了排序需要进行的迭代次数。

第 3 步: 使用计数排序的概念,根据个位数字对数字进行排序。

第 4 步: 再次根据十位数字对数字进行排序,然后是百位,并一直重复此过程,直到我们到达最高有效位。

基数排序算法的工作原理

让我们看看基数排序算法的工作原理。考虑以下未排序的数组。

Radix Sort Algorithm

首先,我们必须从给定数组中找到最大的元素(在我们的例子中是 803)。它有三位数字。所以,迭代将进行三次。

第一次迭代

在第一轮中,列表根据个位上的数字进行排序。

Radix Sort Algorithm

第二次迭代

在这一轮中,列表根据下一个有效位(即十位上的数字)进行排序。第二次迭代后,数组元素为

Radix Sort Algorithm

第三次迭代

在这一轮中,列表根据下一个有效位(即百位上的数字)进行排序。第三次迭代后,数组元素为

Radix Sort Algorithm

现在,数组已按升序排序。

在 Python/Java/C/C++/C# 中实现基数排序

Python 程序

立即执行

Java 程序

编译并运行

C++ 程序

编译并运行

C 语言程序

编译并运行

C# 程序

编译并运行

输出

Before Sorting array elements are: 
171 46 76 91 803 25 3 67 
After Sorting array elements are: 
3 25 46 67 76 91 171 803 

复杂度分析

时间复杂度

情况时间复杂度
最佳情况O(d * (n + b))
平均情况O(d * (n + b))
最坏情况O(d * (n + b))

在所有三种情况下,基数排序的时间复杂度为 O(d * (n + b)),其中 d 是数组中最大元素存在的位数。n 是数组中存在的元素总数,b 是程序中使用的数字系统的基数。在我们的例子中,我们使用了基数 10。

空间复杂度

基数排序的空间复杂度为 O(n + b),其中 n 是数组中存在的元素总数,b 是数字系统的基数。

基数排序的应用

  • 它是一种常用的算法,适用于范围不大但有限的场景。例如,按时间对事件排序,按成绩对学生排序,按日、年、月、时间等对事件排序。
  • 它曾被用于有 80 列的卡片排序设备,在每一列中,设备只能在 12 个位置打孔。然后,排序机被设计为根据卡片被打孔的位置对卡片进行排序。

基数排序的优点

  • 基数排序具有线性时间复杂度。因此,对于大型数据集,它比其他基于比较的排序算法(如归并排序和快速排序)更快。
  • 基数排序是一种稳定的排序算法。
  • 基数排序非常适合对大量字符串或整数进行排序。
  • 在基数排序中可以轻松实现并行化。

基数排序的缺点

  • 基数排序不适用于对浮点数或其他无法映射到少量位数的数据类型进行排序。
  • 基数排序需要相当大的内存来存储每个数字出现的频率。
  • 它不适合小型数据集或唯一键数量少的数据集。
  • 基数排序要求待排序的数据可以用固定位数的数字表示,这对于某些类型的数据可能不成立。

结论

在处理需要高效排序的庞大数据集时,基数排序是一种有用的排序技术,当使用字符或数字来组织数据时,它的效果最好。


下一个主题计数排序