思想:
nums = [73, 22, 93, 43, 55, 14, 28, 65, 39, 81]
一.遍历列表按个位数字分配至编号 0 到 9 的桶子中:
0: 1:81 2:22 3:73,93,43 4:14 5:55,65 6: 7: 8:28 9:39
二.将这些桶子中的数值重新串接起来:
[81, 22, 73, 93, 43, 14, 55, 65, 28, 39]
按十位数字再次分配:(稳定性排序,保持个数的序列)
0: 1:14 2:22,28 3:39 4:43 5:55 6:65 7:73 8:81 9:93
三.重新串接:[14, 22, 28, 39, 43, 55, 65, 73, 81, 93]
##基数排序O(nlog(d))
s = [345,7213,44,73209,10004,7,3667]
def radix_sort(s) -> list:
#1.全部入队main
main = Queue()
for n in s:
main.enqueue(n)
#2.找最大的数,以及它的位数
d = len(str(max(s)))
dstr = '%%0%dd' % d
#前导0的模板,如'%05d',这里的5是最大数的位数
#dstr=[00345,07213,000044,73209,10004,00007,03667]
#3.10进制 准备10个队列
nums = [Queue( for _ in range(10))]
#4.进行按位基数排序
for i in range(-1,-d-1,-1):
#i用于下标,表示个位到最高位
while not main.isEmpty():
n = main.dequeue() #从main分发出去
dn = (dstr % n)[i]
#转成类似'00345'[-2],这是倒数第二位
nums[int(dn)].enqueue(n)
for k in range(10):
#从10个队列以此集中到main
while not nums[k].isEmpty():
main.enqueue(nums[k].dequeue())
#5.从main导出为列表
result = []
while not main.isEmpty():
result.append(main.dequeue())
return result