使用队列进行基数排序

Radix Sorting using using Queues

我正在尝试创建一个使用队列进行排序的基数排序。 我用于我的队列 class 的代码是基本的,但它有效:

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 个 bin。 1 个箱子可装下所有东西。其他 10 个 bin 标记为 0 到 9。第一轮排序首先从主 bin 中删除 1 个数字,然后查看个位的数字,如果该数字是 0,我们将它放在零 bin 中,如果它是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 行......),但这是逻辑上想到的第一件事。谁能指出我更好的解决方案?

您可以 运行 一个 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.

要扩展到并非每个数字串的长度都相同的情况,您可以适当地用零填充(取决于您在小数点的哪一侧。)