问题描述
|
我知道如何对数组进行排序,但是我之前没有对堆栈进行排序。
所以请帮忙。如何使用quicksort算法对堆栈进行排序?
谢谢。
解决方法
我知道如何对数组进行排序,但是我以前没有对堆栈进行排序。
最有效的解决方案可能是将数据结构更改为允许随机访问的列表,然后对列表进行排序。即,像这样的东西:
将堆栈中的所有元素弹出到数组中
使用您知道的算法并对数组进行排序。
将所有元素推回堆栈。
如果您绝对不想使用列表,则可能会发现此解决方案很有趣。 (从这里被盗):
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);
}
}
,“对堆栈进行排序”是什么意思?堆栈的整体思想是按照后进先出(LIFO)的顺序进行。使用堆栈的事物期望它们放置在堆栈中的最新事物将位于堆栈的顶部,而较旧的事物位于其下方,因此插入时的顺序相反,因为这就是堆栈。如果您对堆栈进行排序,将会破坏它。
,您可以做的是..使用递归,递归地弹出堆栈中的元素,然后找到插入当前元素的最佳位置。让我知道您是否需要代码,但是如前面的注释中所述,对堆栈进行排序是完全没有必要的:) :)
,我编写了此函数,以使用O(n)空间对堆栈进行排序。这工作得很好。我将不胜感激时间的改善。现在是O(n * n)。
StackHead sortStack(StackHead s1){
StackHead s2=createStack();
Element a,b;
while(!isEmpty(s1)){
a=top(s1);s1=pop(s1);
if(isEmpty(s2) || top(s2) > a){
s2=push(a,s2);
} else {
while(top(s2)<=a && !isEmpty(s2)){
b=top(s2); s2=pop(s2);
s1=push(b,s1);
}
s2=push(a,s2);
while( (isEmpty(s2) || top(s1) < top(s2) ) && !isEmpty(s1)) {
b=top(s1); s1=pop(s1);
s2=push(b,s2);
}
}//end of else
}//end of outer while
return s2;
}