按升序排序堆栈?

时间:2011-10-15 18:11:22

标签: c sorting stack dynamic-programming

按升序排序堆栈的最佳方法是什么?我遇到了这个面试问题,我遇到了一些问题,以获得最佳和最有效的解决方案。

我能想到两种方法。

  1. 弹出堆栈的所有内容并将它们存储在一个数组中,然后在数组中对数组进行排序 O(nLog n)然后将内容推回堆栈。不是最好的方式....

  2. 执行堆栈的递归实现以进行排序

  3. void sort(stack)
    {
        type x;
    
        if (!isEmpty(stack)) {
            x = pop(stack);
            sort(stack);
            insert(x, stack);
        }           
    }
    
    void insert(x, stack)
    {
        type y;
    
        if (!isEmpty(stack) && top(stack) < x) {
            y = pop(stack);
            insert(x, stack);
            push(y, stack);
        } 
        else {
            push(x, stack);
        }
    } 
    

    但是第二种方法似乎是进行了太多的递归调用,如果堆栈真的很大,那么开销会有问题。

    是否有可能以更好的方式解决此问题,以获得最佳的空间和时间复杂度?

    有很多递归调用(重叠的子问题),这是dynamic programming类问题的竞争者吗?

    解决这个问题的最佳方法是什么? ?

3 个答案:

答案 0 :(得分:3)

这是一个堆栈。你看不到除了最高价值之外的任何东西。你必须至少弹出一次,然后至少推送一次。第一种方法很好。

如果堆栈操作很昂贵,但你有一个时间截止日期,请在弹出时使用插入排序,并且可以在完成最后一次弹出后立即按下。但是你说这是用C ++编写的,所以我怀疑我们是在考虑这种情况。

答案 1 :(得分:3)

您可以通过消除递归来解决。为此,您只需在堆栈下使用循环迭代,直到它为空。

例如,伪代码:

Linekd Stack stack = new List ();

while stack is not empty then

     element <- stack removes peek

     / / Recursiong
     push new elements on stack

end

答案 2 :(得分:-1)

这个问题的复杂性不能小于O(n ^ 2)。如需进一步参考,请参阅here