两层循环总执行次数需按嵌套关系计算,即外层每迭代一次内层完整执行一遍;关键看内层边界是否依赖外层变量,若固定则为外层次数×内层次数。

两层循环的总执行次数不能只看外层或内层单独跑多少次,得把它们嵌套关系拆开算——核心是「外层每迭代一次,内层完整跑一遍」。
看清楚内层循环的边界是否依赖外层变量
这是最容易误判的地方。如果内层循环上限写死(比如 j ),那每次外层迭代都固定执行 10 次;但如果上限是 <code>j 或 <code>j ,次数就随外层变化。
- 固定上限:外层
i从 0 到n-1,内层j总是0到9→ 总次数 =n * 10 - 动态上限:外层
i从 0 到n-1,内层j从 0 到i→ 总次数 =0 + 1 + 2 + ... + (n-1)=n*(n-1)/2 - 反向收缩:像冒泡排序里的
j ,第 0 轮跑 <code>n-1次,第 1 轮跑n-2次……最后一轮跑 1 次 → 总次数还是n*(n-1)/2
别数空语句,只统计实际执行的「关键操作」
时间复杂度分析里,我们只关心影响性能的核心动作,比如 if 判断、数组访问、赋值、函数调用等。像 int j = 0; 这种初始化语句在 for 循环头里,每次外层迭代都会重做,但它本身开销极小,通常不计入主导项。
- 真正该数的是循环体内部的语句,尤其是
arr[j] > arr[j+1]这类比较,或sum += arr[i][j]这类计算 - 如果循环体为空(只有
;),那总执行次数就是纯结构次数,但这种代码一般没意义 - 编译器可能优化掉明显无副作用的空循环,所以实测次数 ≠ 理论次数
用具体例子验证你的计算是否对得上
拿一个最典型的双重遍历二维数组场景:for (int i = 0; i 。这个结构不管 <code>m 和 n 是多少,总执行次数就是 m * n,不会多也不会少。
- 当
m == 3、n == 4时,手数一遍:i=0 → j=0,1,2,3(4 次);i=1 → 同样 4 次;i=2 → 同样 4 次 → 共 12 次 - 如果写成
for (int i = 0; i ,那就不是 <code>n²,而是n*(n+1)/2,因为内层越来越短 - 错误写法:
for (int i = 0; i —— 分号导致内层循环体为空,后面的 <code>{...}根本不进循环,这种 bug 很隐蔽
最常被忽略的是循环变量的作用域和更新时机。比如 for (int i = 0; i ,这里内层同时改了 <code>i,会干扰外层逻辑,导致次数远低于预期。嵌套循环看似简单,但变量污染和边界错位才是真坑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











