c - 写下这个给定代码的最坏情况运行时间 O(n)?
问题描述
我得到了以下代码:
void sort(int a[], int n)
{
for(int i = 0; i < n - 1; i++)
for(int j = 0; j < n - i - 1; j++)
if(a[j] > a[j+1])
swap(a + j, a + j + 1);
}
我必须计算这段代码的最坏情况运行时间 O(n)。
n 是 20,所以我在想,是 O(n) = 20 - 1,还是 O(n)= n-1?
解决方案
任何时候你看到一个双重嵌套的 for 循环,你的第一反应应该是 :likely O(N²)
。
但让我们证明一下。
从外循环开始。它将迭代n-1
多次。随着n
变得非常大,该-1
部分可以忽略不计。所以外部循环的迭代非常接近n
迭代。
当 时i==0
,内部循环将迭代 n-2 次。n
但同样,在规模上和规模上并没有太大区别n-2
。所以让我们说它迭代n
次数。
当 时i==n-2
,内部循环将只迭代一次。
因此,内部循环平均迭代n/2
次数。
因此,if(a[j] > a[j+1])
被评估大约n * n/2
次。或n²/2
次。对于 Big-O 表示法,我们只关心最大的多项式,而不关心它前面的任何因子。因此,O(N²)
是运行时间。最好的、最差的和平均的。
推荐阅读
- javascript - 在后面的代码中从 Vector3D 列表创建 GeometryModel3D 对象
- html - 即使链接正确,自定义css文件也无法启动引导程序?
- python - Pandas:使用索引值对数据框进行切片
- c# - 在 Gridview 中单击链接按钮时显示弹出窗口
- python - 用逗号拆分列表列表(用引号“”包围的值除外)
- android - 如何在我的 .android 路径中生成 debug.keystore 文件
- laravel-5 - 如何在实时服务器上检查 laravel 5.2 中正在运行的调度程序作业?
- authentication - 在微服务中实现身份的合适方法是什么?
- kubernetes - 入口服务 - 不同的重写
- mql4 - 为什么第二个未平仓卖单没有执行?