题目内容:
实现一个基数排序算法,用于10进制的正整数从小到大的排序。
思路是保持10个队列(队列0、队列1…队列9、队列main),开始,所有的数都在main队列,没有排序。
第一趟将所有的数根据其10进制个位(09),放入相应的队列09,全放好后,按照FIFO的顺序,将每个队列的数合并排到main队列。
第二趟再从main队列队首取数,根据其十位的数值,放入相应队列0~9,全放好后,仍然按照FIFO的顺序,将每个队列的数合并排到main队列。
第三趟放百位,再合并;第四趟放千位,再合并。
直到最多的位数放完,合并完,这样main队列里就是排好序的数列了。
输入格式:
一个列表mylist,其中mylist包含一些需要排序的正整数,正整数互不相同且均不超过100000,且个数在1至1000之间。
输出格式:
一个与mylist等长的列表。
输入样例:
[8, 91, 34, 22, 65, 30, 4, 55, 18]
输出样例:
[4, 8, 18, 22, 30, 34, 55, 65, 91]
代码:
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
import math
def RadixSort(mylist):
K = int(math.ceil(math.log(max(mylist), 10))) + 1 #需要进行几次排序
bucket = [Queue() for i in range(10)]
for i in range(1, K+1):
for val in mylist:
bucket[int((val/10**(i-1))%10)].enqueue(val)
del mylist[:]
for queue in bucket:
while not queue.isEmpty():
mylist.append(queue.dequeue())
return mylist