python 基数排序

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
111,61,51
252
323
4
5
6
7
888
9

回收,lists=[11,61,51,52,23,88]

2、第二趟排序,看十位:

桶序号列表元素
0
111
223
3
4
551,52
661
7
888
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)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值