使用队列

时间:2017-02-09 19:38:10

标签: python queue radix-sort

我正在尝试创建一个使用队列进行排序的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行......),但这是逻辑上首先想到的。有人能指出我更好的解决方案吗?

1 个答案:

答案 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.

要扩展到并非每个数字字符串具有相同长度的情况,您可以根据需要使用零填充(取决于您所在的小数点的哪一侧。)