java - 冒泡排序的最佳情况是 O(n) 而不是 O(n^2) 的解释?
问题描述
给定一个冒泡排序算法
for (int i = 0; i < A.length - 1; i++)
for (int j = 0; j < A.length - i - 1; j++)
if (A[j] > A[j + 1]) {
int temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
}
在给定数组已经排序的情况下,内部循环中的 if 语句将始终为假,打破内部 for 循环并递增j
直到A.length-i-1
到达。A.length-i-1
达到时,递增i
。这个过程循环直到i
到达A.length-1
。
我的困惑:
如果两个嵌套循环都迭代到它们各自的上限,尽管没有进行交换,但最佳情况下时间复杂度是否仍为O(n^2) ?谁能简单地向我解释为什么会是O(n)
解决方案
如果程序按原样,是的,最好的情况仍然需要 O(n^2)。但是你可以增强这个程序。
在您第一次通过时,您会看到没有进行任何交换。您可以保留一个标志,检查是否在通行证期间没有发生交换,您不需要进一步通行证。
在这种情况下,您只会做一次,时间复杂度将是 O(n)
示例程序(可以更好地结构化):
boolean previousIterationSwap = false;
final int[] A = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < A.length - 1; i++) {
// After the first iteration check if previous iteration had any
// swap
if (i > 0 && !previousIterationSwap) {
break;
}
for (int j = 0; j < A.length - i - 1; j++) {
if (A[j] > A[j + 1]) {
previousIterationSwap = true;
final int temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
} else {
previousIterationSwap = false;
}
}
}
推荐阅读
- cypress - cy.request() TypeError [ERR_INVALID_CHAR]: 标头内容中的无效字符 ["cookie"]
- node.js - 当我尝试只设置一个对象的键时,为什么所有对象的键都设置为值?
- mongodb - MongoDB:更新集合的所有文档中的特定字段,给定一个只有目标字段和新值的特定数组
- git - 让 'git log' 忽略 0 次更改的提交
- android - 控制何时在 Google Play 商店上发布您的应用
- javascript - findIndex 返回未定义而不是数字
- javascript - 将 React 组件注入 html 页面
- java - 无法让 UHF 阅读器读取标签
- python - 单击按钮后是否可以添加 2 个新的输入字段?
- docker - Flask Docker - 2 容器通信 - ConnectionError:HTTPConnectionPool:url 超出最大重试次数: