python 基数排序
一、算法思想
基数排序又称“桶排序”,其原理是:
首先准备好0~9号9个桶,
1、对于需要排序的列表lists=[11,23,52,88,61,51]中的元素,从个位开始看,个位数字相同的放入与其序号相同的筒子中(如11,61,51放入1号桶中);
2、lists中的所有6个元素放置好后,再从0~9号桶开始回收所有6个元素,顺序是:按照先进先出的顺序回收每个桶中的元素,例如:1号桶的回收顺序是11,61,51;
回收完毕,此时,lists=[11,61,51,52,23,88].
至此,结束了对于个位数的排序,以下只要重复以上两步,再对十位数进行排序即可
十位数排序完成后的结果是lists=[11,23,51,52,61,88],排序完成。
由于列表lists中元素最高位只是2位,所以只需排到十位数即可,排序的趟数取决于最大元素的最高位数。
二、基数排序的示意图
1、第一趟排序,先看个位:
桶序号 | 列表元素 |
---|---|
0 | |
1 | 11,61,51 |
2 | 52 |
3 | 23 |
4 | |
5 | |
6 | |
7 | |
8 | 88 |
9 |
回收,lists=[11,61,51,52,23,88]
2、第二趟排序,看十位:
桶序号 | 列表元素 |
---|---|
0 | |
1 | 11 |
2 | 23 |
3 | |
4 | |
5 | 51,52 |
6 | 61 |
7 | |
8 | 88 |
9 |
回收,lists=[11,23,51,52,61,88]
十位排序完成,排序结束。
python实现
#基数排序:
from random import randint
def radix_sort(lists,d):#d是lists中最大元素的最高位数,一共需要d趟排序
for k in range(d):
s=[[] for i in range(10)]#s=[[],[],[],[],[],[],[],[],[],[]]
for data in lists:
s[data//(10**k)%10].append(data)#k=0,1,2,...,d-1;k=0时,将个位相同(假设个位为2)的元素放入同一个(序号为2)桶中;k=1时,以此类推。
lists=[item for each_s in s for item in each_s]#回收
#在此程序中,若将此句改写为lists=[each_s for each_s in s]会报错
'''
注意:
虽然 each_s for each_s in s 也可以打印出与 item for each_s in s for item in
each_s 一样的效果,但是第一条语句的默认结果是lists中的元素以列表为单位存在
而第二条语句的默认结果是以元素为单位存在
对于本程序而言,如果采用each_s for each_s in s , 那么就会报错
因为对于语句s[data//(10**k)%10].append(data)来说,将会导致data//(10**k)报出
类型错误:TypeError: unsupported operand type(s) for //: 'list' and 'int'
'''
return lists
lists=[randint(0,520) for i in range(8)]
sorted_list=radix_sort(lists,3)
print(sorted_list)