堆栈按O(N)排序

时间:2017-03-09 04:23:07

标签: java sorting stack

我正在创建一个方法来测试给定堆栈是否已排序。我已经完成了该程序的主要任务,但是有一种方法可以在没有O(N ^ 2)的情况下实现该算法。我想用O(N)得到这个。这样的解决方案是否存在?如果是这样,有人会指出我正确的方向。

一些规则 - 只能制作一个辅助堆栈。 - 没有其他数据结构。 - 如果堆栈为空或有一个项目,则假定它已被排序。 - 必须在 O(N)

中执行
public static boolean isSorted(Stack s){

    boolean sorted = true;
    Stack backup = new Stack();

    int prev, curr;

    if(s.isEmpty() || s.size() == 1) {

        sorted = true;  

    } else {

        while(!s.isEmpty()){

            prev = s.pop();
            backup.push(prev);

            curr = s.pop();
            backup.push(curr);

            if(prev > curr && sorted)
                sorted = false;

        }

    }

    while(!backup.isEmpty()) {
        s.push(backup.pop());
    }


    return sorted;

}

示例输入:{20,20,17,11,9,8,3,2}

输出:

 top 2 3 8 9 11 17 20 20 bottom
| isSorted = true
| top 2 3 8 9 11 17 20 20 bottom

在功能结束时。给定的堆栈应该处于其原始状态。我只需要在O(N)

中得到这个

1 个答案:

答案 0 :(得分:2)

你在这里提出的概念不是O(n 2 ),而是O(n) - 对于堆栈的每个元素,你执行一定数量的操作,无论N的大小。

然而,你应该注意到你有一个错误 - 在循环的每次迭代中你弹出两个元素并比较它们,所以你只有在每对元素被排序时才有效地测试,而不是整个设置(例如,尝试使用值{2,1,500,400}的此算法)。另外,请注意,连续的相等值不会中断排序,因此您应该使用>=而不是>。另一个优化可能是在您检测到堆栈未排序后快速失败:

public static boolean isSorted(Stack s) {

    boolean sorted = true;
    Stack backup = new Stack();

    int prev;
    int curr = Integer.MIN_VALUE;

    while (!s.isEmpty() && sorted) {
        prev = curr;
        curr = s.pop();
        backup.push(curr);
        sorted = (prev <= curr);
    }

    while (!backup.isEmpty()) {
        s.push(backup.pop());
    }

    return sorted;
}