概述
基数排序算法是一种排序的算法。简而言之,先对所有数的个位进行排序、接着对十位进行排序,然后百位进行排序,以此类推,直到所有的位数排完,得到最终的排序。
具体的步骤:生成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后面记得把列表倒置以下输出。由于我定义的队列开头在左,不倒过来的话就是从大到小排列了。
最后结果如下:
作为一个小白,代码肯定有很多写得不好的地方,比如写得繁琐等等。希望有大佬路过,指点指点。也希望能够帮到看到这篇文章的朋友。
以上。
最后
以上就是懵懂绿草为你收集整理的python按相反的顺序输出列表_基数排序算法的python实现的全部内容,希望文章能够帮你解决python按相反的顺序输出列表_基数排序算法的python实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复