我已经被问及这个问题,我认为这是可行的,但是我很难想出一个算法来做到这一点。限制是你不能使用任何其他数据结构,也不能创建另一个队列。你也只能使用入队,出队和偷看(不是优先队列)。使用相同的队列对队列进行排序
thanx的贡献:)
我已经被问及这个问题,我认为这是可行的,但是我很难想出一个算法来做到这一点。限制是你不能使用任何其他数据结构,也不能创建另一个队列。你也只能使用入队,出队和偷看(不是优先队列)。使用相同的队列对队列进行排序
thanx的贡献:)
Sort(Q,n):
for i = 0 to n-1
min = findMin(Q, n-i, n)
reorder(Q, min, n)
end for
findMin(Q, k, n):
min = infinity
for i = 1 to n
curr = dequeue(Q)
if curr < min && i<=k
min = curr
end if
enqueue(Q,curr)
end for
return min
reorder(Q, min, n):
for i = 1 to n
curr = dequeue(Q)
if (curr != min) // I'm assuming that there is a way to differentiate between any two items, this isn't hard to enforce
enqueue(Q, curr)
end if
end for
enqueue(Q,min)
升序排序,运行在O(N^2)的时候,在空间O(1)(即,队列是O(n)的空间,并且额外的空间所需通过该算法是O(1))
说明:
本质上,我们通过队列n次,每次迭代成本2n个迭代。
在每次迭代时,我们会遍历整个队列并在相关数量的项目中选取最小值。因此,首先相关数量的项目是n,因为我们希望它们的全部最小。下一次迭代我们需要最小的n-1个项目,然后是n-2个项目等。由于算法将在最后堆叠这些最小值。
一旦我们找到最小值,我们需要重新遍历整个堆栈,以便抓取它并将其堆叠到最后。
这里的主要想法是,一个出队列表后面跟着一个相同元素的排队将允许我们迭代队列并检查最小/最大值,同时保持顺序。
冒泡使用队列:
n <- size of queue
repeat n times
x <- dequeue item
repeat (n-1) times
y <- dequeue item
if x < y then
enqueue y
else
enqueue x
x <- y
enqueue x
我会很惊讶,如果你能做到这一点。不过,我认为你需要对你允许使用什么样的临时内存做更具体的说明。我假设你只允许'O(1)'内存? – ltjax 2011-02-27 15:58:25
时间和空间复杂性都没有限制。然而,这是暗示空间复杂性将是1,除非有递归解决方案,并且计算每个递归调用创建的StackFrames被认为增加了空间复杂度。 – 3ashmawy 2011-02-27 16:03:02
'peek'只返回队列的头部,还是可以用它来查找队列中任何位置的值? – IVlad 2011-02-27 16:05:15