队列与基数排序(基于Python)

基数排序

思路简介

基数排序的核心思想是按位数比较各个待排序数字的大小,(在比较前先创建9个队列分别代表数字0~9)先比较个位大小,将比较完的数放入队列(main队列)中,再比较十位数的大小,注意在这里需要先清空之前的队列(因为先前的队列已经用于存放第一次排序即个位数排序后的结果了),再将排序结果存入先前的队列(main队列)。直到比完最高位得到的排序结果即为所需的结果。

疑问与解答

在此次编程中,主要是有两个问题:①为什么要用队列实现而不是列表?②如果该为基数相同如何处理,比如:223与23的个位都是3

在这里可以用一个实例来解答
8,223,23,7,92,45,2019,9
这里223与23,2019与9的个位都相同因此放入数字3队列与数字9队列。因此队列3:223,23;队列9:2019,9。代表其余数字的队列均只有一个数。然后按0~9的顺序出队列得到第一次排序结果
第一次比较个位:92,223,23,45,7,8,2019,9
(如果使用栈的话用Pop则为92,23,223,45,7,8,9,2019)
接下来按照十位入0~9队列(这里不需要清空因为dequeue方法得出排序结果的过程就已经清空了)。注意到十位223与23仍然相同,因此队列2中有两个数223与23。其余队列均只有一个数
第二次比较十位结果是:7,8,9,2019,223,23,45,92
(如果使用栈则为7,8,9,2019,223,23,45,92是一样的因为利用了栈的特性两次反序结果相同)。
此后不再有相同的依次比较即可以得出最后的结果。
因此使用其他的线性结果不影响基数排序的结果。只不过队列是能够保持入队顺序,而栈则反序。

代码展示

from queue import Queue#导入队列数据结构
def func(mylist):
    qlist=[]
    main=Queue()#实例化一个队列,这里直接使用类的名字即等价表示调用类中初始化函数中的方法
    for i in mylist:
        main.enqueue(i)#将Mylist中的元素全部转移到main队列中
    for i in range(0,10):
        qlist.append(Queue())#生成10个队列并且存入列表中

    for i in range(0,6):#因为上限是6位所以至多需要排序六次,因此这里取最坏情况,如果要优化的话可以从这里着手
        for j in main.queue:
        #j为待排序的数,按照其每次循环对应的基数大小将该数放入相应的队列中
            qlist[int(j/(10**i)%10)].enqueue(j)#这个时候k是bu里面的基数即0~9,全部放入队列0~9中
        for n in range(0,main.size()):
            #print(main.queue)测试用码
            main.dequeue()#每经过一次大循环都将main队列清空一次以便于放入新排序好的数
        for k in range(0,10):#从各个队列中依次放入新排好的数进入main队列
            for m in range(0,qlist[k].size()):
                main.enqueue(qlist[k].dequeue())
    return main.queue
     
while True:
    mylist = eval(input('input here: '))
    print(func(mylist))

注意这里eval函数用于将输入字符串转换为列表

参考

1.CSDN博客园
2.https://www.jb51.net/article/128410.htm关于eval函数的解释
3.MOOC《Python与数据结构》

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值