思路

    Step1: 先按照个位分桶并且输出
    Step2: 再按照十位分桶并且输出
    Step3: 重复上述操作

    分桶次数由列表中最大的元素确定

    确定一个正整数的位数
    方法一:math.ceil(math.log10(max_num))
    方法二:str(max_num).__len__()
    方法三:
        it = 0;
        while 10 ** it <= max_num:
            it += 1

时间复杂度

O(kn)  k为位数

空间复杂度

O(k + n)

代码示例

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""基数排序

思路:
    Step1: 先按照个位分桶并且输出
    Step2: 再按照十位分桶并且输出
    Step3: 重复上述操作

    分桶次数由列表中最大的元素确定

    确定一个正整数的位数
    方法一:math.ceil(math.log10(max_num))
    方法二:str(max_num).__len__()
    方法三:
        it = 0;
        while 10 ** it <= max_num:
            it += 1

(线性)时间复杂度:O(kn)  k为位数

空间复杂度:O(k + n)
"""
import random


def radix_sort(ls):
    """基数排序

    Args:
        :param ls: list, 待排序的列表
    """

    max_num = max(ls)
    it = 0

    while 10 ** it <= max_num:
        # 创建桶
        # 桶的个数是确定的,毕竟每个位数范围在[0, 9]
        buckets = [[] for _ in range(10)]

        # 分桶
        for item in ls:
            pos = item // 10 ** it % 10
            buckets[pos].append(item)

        # 输出
        ls.clear()
        for buc in buckets:
            ls.extend(buc)

        # 对下一位分桶
        it += 1


ls = [random.randint(0, 10000) for _ in range(1000)]
random.shuffle(ls)
radix_sort(ls)
print(ls)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐