一、引入
多关键字排序:假如现在有一个员工表。要求按照薪资排序,薪资相同的员工按照年龄排序。
- 先按照年龄进行排序,再按照薪资进行稳定的排序
按照这种思路我们对[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为2while 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 = 9digit = (var // 10 ** it) % 10 # 代表将此时it指代的那一位数字取出来buckets[digit].append(var) # 在对应的桶中添加元素# 再将元素依次从桶中取出来li.clear()for buc in buckets:li.extend(buc) # 再将元素依次写入liit += 1import random
li = list(range(1000))
random.shuffle(li)
radix_sort(li)
print(li)
三、时间复杂度
- 时间复杂度:O(kn)
- 空间复杂度:O(k+n)
- k表示数字位数
注意点:常见的字符串排序:例如abcd和ab;我们需要自动补零abcd和ac00;数字比较大小是首位补零;例如123和012