一、引入
多关键字排序:假如现在有一个员工表。要求按照薪资排序,薪资相同的员工按照年龄排序。
- 先按照年龄进行排序,再按照薪资进行稳定的排序
按照这种思路我们对[32,13,94,52,17,54,93]排序:
- 先比较十位数的数字大小;(如果十位一样)再比较个位数的数字大小。
- 个位数字的范围为0~9,因此可以分成10个桶,将每个数字根据个位数字放入对应的桶中,再对桶中的数字根据十位数排序。(相当于先排个位数)
- 再将数字取出来,根据十位数字分桶,最后再依次取出,即排好序。(先进先出)
二、代码演示
代码演示如下:
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