python按相反的顺序输出列表_基数排序算法的python实现

基数排序算法是一种排序的算法。简而言之,先对所有数的个位进行排序、接着对十位进行排序,然后百位进行排序,以此类推,直到所有的位数排完,得到最终的排序。

具体的步骤:生成10个队列(0-9)以存储各个位数相应的排列,main队列一开始放置没有排列的数,中间过程的时候起到过渡的作用,最后生成的有序数列放在main队列中。

将所有的数的个位存放到这10个队列中,然后按照“先进先出”(FIFO)的顺序输入到main队列中。

从main中按顺序取数,以十位的数放入10个队列中,在按照FIFO输入到main队列。

以此类推,直到所有的位数取完。

最后main队列中的数为排好的队列。

以下动图(侵删)很好的展示了这个过程:

我的实现方法:

class Queue:

def __init__(self):

self.items = []

def isEmpty(self):

return self.items == []

def enqueue(self,item):

self.items.append(item)

def dequeue(self):

return self.items.pop(0)

def show(self):

return self.items

def size(self):

return len(self.items)

首先写了一个队列的数据结构。我写的这个队列首段是在左端,末端在右端,可能与通常的写法相反,不过非要一样的话也很好改。我觉得python自带的列表其实也可以实现队列的功能,不过写法要繁琐一些,注意的地方多一点。

q0 = Queue()

q1 = Queue()

q2 = Queue()

q3 = Queue()

q4 = Queue()

q5 = Queue()

q6 = Queue()

q7 = Queue()

q8 = Queue()

q9 = Queue()

main = Queue()

我非常蠢地生成了10个队列。应该是有批量生成列表(队列)的方法。我这里就不写了。

def numPos(number,pos):

if len(str(number)) < pos:

return 0

else:

return int(str(number)[-pos])

定义了一个numPos的函数,作用是取一个数的某个位数上的数。比如numPos(123,1)意为取123的个位,为3。numPos(123,4)意为取千位,但是123没有千位,所以取0。

def arrayPos(mylist,pos):

for num in main.show():

qpos = '0123456789'.index(str(numPos(num,pos)))

eval('q{}.enqueue({})'.format(qpos,num))

while not main.isEmpty():

main.dequeue()

for i in '9876543210':

while not eval('q{}.isEmpty()'.format(i)):

eval('main.enqueue(q{}.dequeue())'.format(i))

这个函数就是主要发挥作用的函数了。有两个参量,一个是要处理的队列,一个是要处理的位数。

第一个for循环表示:将main队列中每个数某个位数进行归入0-9队列。使用了循环和eval函数,可以批量进行导入,不用写重复的代码,很方便。需要注意:什么地方是整型,什么地方是字符串。

while循环为了清空main队列,要不然的话,最后输出来一大串。

第二个for循环,和第一个for循环相反,是把0-9队列的数按照顺序返回给main队列。需要注意:0-9队列可能有些队列是空的,需要做个判断否则报错。也别忘了把变0-9队列给清空了。

def func(mylist):

for i in mylist:

main.enqueue(i)

for n in range(1,len(str(max(main.show())))+1):

arrayPos(mylist,n)

return main.show()[::-1]

mylist = eval(input())

print(func(mylist))

最后,写了一个主函数。

第一个for循环是将列表导入main队列。

第二个for循环,有一个n,有多少位数循环多少次。所以要在队列中找到最大的数,并且看看有多少位。然后不断的循环的执行arrayPos函数。

需要注意的是,知道了多少位,别忘了加一,range函数是左闭右开的,return后面记得把列表倒置以下输出。由于我定义的队列开头在左,不倒过来的话就是从大到小排列了。

最后结果如下:

作为一个小白,代码肯定有很多写得不好的地方,比如写得繁琐等等。希望有大佬路过,指点指点。也希望能够帮到看到这篇文章的朋友。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值