我正在尝试创建一个使用队列进行排序的Radix Sort。 我用于我的Queue类的代码是基本的,但它可以工作:
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, items):
self.items.insert(0, items) #add item to the beginning
def dequeue(self):
return self.items.pop() # remove last item
def peek(self):
return self.items[len(self.items)-1] #First in line
def size(self):
return len(self.items)
据我所知,基数排序使用了11个总箱。 1 bin拥有一切。其他10个箱子标记为0到9.第一轮分拣开始于从主箱中移除1个号码并查看那个位置的数字,如果该数字为0,我们将其放入零箱中,如果它是1我们把它放在一个箱子里,依此类推。我们这样做,直到主仓中的所有数字都已经在那个地方值中排序,然后我们从零仓开始将这些数字拉出来并将它们放回主仓,然后在十位开始处理然后数百等等。根据我的理解,Radix排序仅在所有数据长度相同时才起作用(或者我已经被告知过了。我假设它已经消失了。
到目前为止,我已将此作为我的基数:
def radix():
mainBin = Queue()
digList = [Queue()] * 10 #creates a list of 10 queues
numberList = random.sample(range(100000,999999), 10)
#This would normally be passed through, but this is easier for timing
#the sort
for num in numberList:
mainBin.enqueue(str(number))
while not mainBin.isEmpty():
temporary = []
number = mainBin.dequeue()
for digit in number:
temporary.append(digit)
if temporary[5] == '0':
digList[0].enqueue(temporary[5])
我在第一个if
声明中停了下来,因为我意识到我必须为10个数字执行此操作,这些数字有6个位值,有10个数字可能性。这是一个很长的if-elif
链写出来的方式(一个地方值为19行......),但这是逻辑上首先想到的。有人能指出我更好的解决方案吗?
答案 0 :(得分:0)
您可以只运行for循环并使用索引,而不是对目标队列进行硬编码。
place = 6 # In this case you know it, but you could scan data to find it.
while place >= 0:
while not mainBin.isEmpty():
number = mainBin.dequeue()
digit = number[place]
digList[digit].enqueue(number)
place -= 1
# Reload mainBin logic goes here.
要扩展到并非每个数字字符串具有相同长度的情况,您可以根据需要使用零填充(取决于您所在的小数点的哪一侧。)