[英]Sorting a Stack in Ascending Order?
按升序排序堆棧的最佳方法是什么? 我遇到了這個面試問題,我遇到了一些問題,以獲得最佳和最有效的解決方案。
我能想到兩種方法。
彈出堆棧的所有內容並將它們存儲在一個數組中,然后對該數組進行排序
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
類型問題的競爭者嗎?
解決這個問題的最佳方法是什么? ?
這是一個堆棧。 你看不到除了最高價值之外的任何東西。 你必須至少彈出一次,然后至少推送一次。 第一種方法很好。
如果堆棧操作很昂貴,但你有一個時間截止日期,請在彈出時使用插入排序,並且可以在完成最后一次彈出后立即按下。 但是你說這是用C ++編寫的,所以我懷疑我們是在考慮這種情況。
您可以通過消除遞歸來解決。 為此,您只需在堆棧下使用循環迭代,直到它為空。
例如,偽代碼:
Linekd Stack stack = new List ();
while stack is not empty then
element <- stack removes peek
/ / Recursiong
push new elements on stack
end
這個問題的復雜性不能小於O(n ^ 2)。 有關詳細參考,請參閱此處
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.