基于Python3的数据结构与算法 - 11 基数排序

本文介绍了如何利用桶排序算法解决多关键字排序问题,如按薪资和年龄对员工表进行排序。通过分桶和迭代的方式实现,展示了代码实现、时间复杂度(O(kn))和空间复杂度(O(k+n)),并提及了字符串排序时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引入

多关键字排序:假如现在有一个员工表。要求按照薪资排序,薪资相同的员工按照年龄排序

  • 先按照年龄进行排序,再按照薪资进行稳定的排序

按照这种思路我们对[32,13,94,52,17,54,93]排序:

  • 先比较十位数的数字大小;(如果十位一样)再比较个位数的数字大小。
  1. 个位数字的范围为0~9,因此可以分成10个桶,将每个数字根据个位数字放入对应的桶中,再对桶中的数字根据十位数排序。(相当于先排个位数)
  2. 再将数字取出来,根据十位数字分桶,最后再依次取出,即排好序。(先进先出)

二、代码演示

代码演示如下:

def radix_sort(li):
    max_num = max(li)    # 最大值为99--2次分桶;最大值为10000--5次分桶
    it = 0   # it指迭代多少次  即9的it为0,99为1,999为2
    while 10 ** it <= max_num:
        buckets = [[] for _ in range(10)]   #创建10个桶
        for var in li:  # 遍历列表中的数字
            # 例如当前有个数字987:当it = 0,取出7;当it = 1,987//10->98 98%10 = 8; 当it = 2,987//100->9  9%10 = 9
            digit = (var // 10 ** it) % 10   # 代表将此时it指代的那一位数字取出来
            buckets[digit].append(var)   # 在对应的桶中添加元素
        # 再将元素依次从桶中取出来
        li.clear()
        for buc in buckets:
            li.extend(buc)   # 再将元素依次写入li
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值