我正在创建一个方法来测试给定堆栈是否已排序。我已经完成了该程序的主要任务,但是有一种方法可以在没有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)
中得到这个答案 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;
}