按升序排序堆栈的最佳方法是什么?我遇到了这个面试问题,我遇到了一些问题,以获得最佳和最有效的解决方案。
我能想到两种方法。
弹出堆栈的所有内容并将它们存储在一个数组中,然后在数组中对数组进行排序
O(nLog n)
然后将内容推回堆栈。不是最好的方式....
执行堆栈的递归实现以进行排序
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
类问题的竞争者吗?
解决这个问题的最佳方法是什么? ?
答案 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