2011-02-27 65 views
7

我已经被问及这个问题,我认为这是可行的,但是我很难想出一个算法来做到这一点。限制是你不能使用任何其他数据结构,也不能创建另一个队列。你也只能使用入队,出队和偷看(不是优先队列)。使用相同的队列对队列进行排序

thanx的贡献:)

+0

我会很惊讶,如果你能做到这一点。不过,我认为你需要对你允许使用什么样的临时内存做更具体的说明。我假设你只允许'O(1)'内存? – ltjax 2011-02-27 15:58:25

+0

时间和空间复杂性都没有限制。然而,这是暗示空间复杂性将是1,除非有递归解决方案,并且计算每个递归调用创建的StackFrames被认为增加了空间复杂度。 – 3ashmawy 2011-02-27 16:03:02

+0

'peek'只返回队列的头部,还是可以用它来查找队列中任何位置的值? – IVlad 2011-02-27 16:05:15

回答

12
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个项目等。由于算法将在最后堆叠这些最小值。

一旦我们找到最小值,我们需要重新遍历整个堆栈,以便抓取它并将其堆叠到最后。

这里的主要想法是,一个出队列表后面跟着一个相同元素的排队将允许我们迭代队列并检查最小/最大值,同时保持顺序。

+0

尼斯,谢谢@davin – 3ashmawy 2011-02-27 16:30:15

+0

该死的,我想出了相同的解决方案,当我回来发布它,我看到你的答案已经发布... eeeeeeh..speed;)...我提高你的速度 – 2011-02-27 16:47:50

+0

@Suraj,如果我有1代表。指向每一次发生在我身上,SO将不得不发明一个新的数据类型来保存BigBigBigInt :) – davin 2011-02-27 16:59:26

3

冒泡使用队列:

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