Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按升序排序堆栈?_C_Sorting_Stack_Dynamic Programming - Fatal编程技术网

C 按升序排序堆栈?

C 按升序排序堆栈?,c,sorting,stack,dynamic-programming,C,Sorting,Stack,Dynamic Programming,按升序排序堆栈的最佳方法是什么?我遇到了这个面试问题,在寻找最佳、最有效的解决方案时遇到了一些问题 我可以想到两种方法 弹出堆栈的所有内容并将其存储在数组中,然后在 O(nLog n)然后将内容推回堆栈。不是最好的方法 执行堆栈的递归实现以对其进行排序 void排序(堆栈) { x型; 如果(!isEmpty(堆栈)){ x=pop(堆栈); 排序(堆栈); 插入(x,堆栈); } } 空心插入(x,堆栈) { y型; 如果(!isEmpty(堆栈)和顶部(堆栈)

按升序排序堆栈的最佳方法是什么?我遇到了这个面试问题,在寻找最佳、最有效的解决方案时遇到了一些问题

我可以想到两种方法

  • 弹出堆栈的所有内容并将其存储在数组中,然后在
    O(nLog n)
    然后将内容推回堆栈。不是最好的方法

  • 执行堆栈的递归实现以对其进行排序

  • void排序(堆栈)
    {
    x型;
    如果(!isEmpty(堆栈)){
    x=pop(堆栈);
    排序(堆栈);
    插入(x,堆栈);
    }           
    }
    空心插入(x,堆栈)
    {
    y型;
    如果(!isEmpty(堆栈)和顶部(堆栈)
    但是第二种方法似乎进行了太多的递归调用,如果堆栈恰好很大,那么开销将是一个问题

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

    有这么多递归调用(重叠子问题),这是
    动态编程
    类型问题的竞争者吗


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

    这是一堆。除了最高值,你什么都看不到。您必须至少弹出所有内容一次,并至少推送所有内容一次。第一种方法很好


    如果堆栈操作很昂贵,但您有一个时间截止日期,那么在弹出时使用插入排序,您可以在最后一次弹出完成后立即推送。但是你说这是C++,所以我怀疑我们正在考虑这样的场景。

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

    例如,伪代码:

    Linekd Stack stack = new List ();
    
    while stack is not empty then
    
         element <- stack removes peek
    
         / / Recursiong
         push new elements on stack
    
    end
    
    Linekd Stack Stack=new List();
    当堆栈不为空时
    
    元素这个问题的复杂性不能小于O(n^2)。如需进一步参考,请参阅

    为什么排序时间不理想?对于一般情况,这是已证明的极限。你不能比
    O(n)
    空间和
    O(n log n)
    时间做得更好。弹出到数组中,排序和推送是最佳的。@avakar:第一个声明(“不能比
    O(n)
    space)更好”)得到了证明?@aix,当然,只需将最小的(或最大的,我不确定堆栈中的哪个元素是第一个)值放在堆栈底部。您必须弹出该值,因为它位于错误的位置,此时,您必须将那些
    n
    值存储在某个地方,需要
    O(n)
    空间。@blastfurny-或者,这是一个很好的面试问题,正确的答案是,“如果您需要一个有序的容器,那么使用不同的数据结构。”你可以用迭代循环和堆栈数据结构来模拟一个递归。这不一样吗?递归使函数调用在堆栈内存中进行,这是相同的实现。当您使用递归本机语言时,需要堆积的不仅仅是数据,还需要堆叠上下文、函数指针等。。如果使用堆栈数据结构,根据堆栈数据的数量,您将获得内存的最佳使用。请再次参考问题。(1) “该算法的时间复杂度为O(N^2)。”这并不意味着O(N^2)是最优的,在这种情况下,按照问题本身的描述,用O(N lg N)来实现它是微不足道的!
    Linekd Stack stack = new List ();
    
    while stack is not empty then
    
         element <- stack removes peek
    
         / / Recursiong
         push new elements on stack
    
    end