基数排序

基数排序(Radix Sort)是一种非比较型整数排序算法,它根据数字的每一位来进行排序。基数排序通过多轮对不同位(如个位、十位、百位等)的排序,逐步使整个序列有序。

1. 基本原理

  • 基数排序是基于桶排序的思想,将整数按位数切割成不同的数字,然后按每个位数分别进行排序。
  • 排序时从最低位(个位)开始,依次对每一位进行排序,直到最高位排序完成。每一轮排序都是稳定的,前一轮的排序结果作为下一轮排序的基础,最终使整个序列有序。

2. 算法步骤

  1. 确定基数:基数通常为10,因为我们使用的是十进制数系统(每一位数字的取值范围是0 - 9)。
  2. 找出最大数:确定数组中的最大数,以便知道排序需要进行的轮数。最大数的位数决定了需要排序的轮数。
  3. 按位排序
    • 从最低位(个位)开始,对数组中的每个元素按照当前位的数字放入对应的桶(0 - 9)中。
    • 收集桶中的元素,按照桶的顺序(从0到9)依次取出元素,形成一个新的序列。
    • 对下一位(十位、百位等)重复上述步骤,直到处理完最大数的最高位。

3. 代码实现

以下是Python语言实现基数排序的代码:

def radix_sort(arr):
    if not arr:
        return arr
    max_num = max(arr)
    exp = 1
    while max_num // exp > 0:
        buckets = [[] for _ in range(10)]
        for num in arr:
            buckets[(num // exp) % 10].append(num)
        arr = [num for bucket in buckets for num in bucket]
        exp *= 10
    return arr

4. 算法分析

  • 时间复杂度
    • 假设数组中有 n 个元素,且最大数有 k 位。每一轮排序都需要遍历数组中的所有 n 个元素,将它们放入桶中并收集,这个过程的时间复杂度为 O(n)
    • 总共需要进行 k 轮排序,所以基数排序的时间复杂度为 O(kn)。在整数的情况下,如果数字的位数相对固定,基数排序的时间复杂度接近线性时间 O(n)
  • 空间复杂度
    • 空间复杂度主要取决于桶的数量和每个桶中元素的数量。在最坏情况下,所有元素都集中在一个桶中,需要额外的 O(n) 空间来存储桶中的元素。同时,还需要 O(10) 的空间来存储桶的数组(因为基数为10)。
    • 所以,基数排序的空间复杂度为 O(n+10),通常可以简化为 O(n)
  • 稳定性:基数排序是稳定的排序算法。在每一轮按位排序中,当两个元素在当前位上的数字相同时,它们在原数组中的相对顺序不会改变。例如,对于数组 [12, 22],在个位排序时,它们会进入同一个桶,并且按照原顺序取出,保证了稳定性。
posted @   codersgl  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示