堆栈以 O(N) 排序
Stack is sorted with O(N)
我正在创建一种方法来测试给定堆栈是否已排序。我已经完成了程序的主要任务,但是有没有办法在没有 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)
中得到这个
您在这里提出的概念不是 O(n2),而是 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;
}
我正在创建一种方法来测试给定堆栈是否已排序。我已经完成了程序的主要任务,但是有没有办法在没有 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)
中得到这个您在这里提出的概念不是 O(n2),而是 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;
}