
前言时间复杂度是算法效率的核心判断标准。本文结合 C 语言代码通俗、直观地讲解八大时间复杂度的区别、原理与适用场景帮助大家彻底看懂代码对应的时间复杂度。八大复杂度效率排序从快到慢O(1) O(log n) O(n) O(n log n) O(n²) O(n³) O(2^n) O(n!)一、前置知识1.1 时间复杂度定义不考虑硬件性能、编程语言带来的差异仅分析数据规模 n 不断增大时代码执行次数的增长速度。1.2 大 O 化简规则记住两条即可1. 只保留最高次项去掉常数、低次项2. 去掉最高次项前面的系数。1.3 log n 说明算法中 log n 默认底数是 2底数是常数大O规则直接忽略统一简写为 log n。二、八大时间复杂度详解带代码通俗解释2.1 O(1) 常数级最快核心特点执行次数固定和数据量 n 无关int a 10; int b a 5; printf(%d, b);解释没有循环、没有递归代码固定执行几次。无论 n 多大运行时间不变。场景变量赋值、简单运算、数组下标取值。2.2 O(log n) 对数级极快核心特点每次循环砍掉一半数据int l 0, r n - 1; while (l r) { int mid (l r) / 2; if (arr[mid] target) return mid; else if (arr[mid] target) l mid 1; else r mid - 1; }解释每次查找范围折半缩小数据越多优势越大循环次数增长极慢。场景二分查找、快速幂、二叉树查找。2.3 O(n) 线性级平稳核心特点数据翻倍运行时间翻倍for (int i 0; i n; i) { printf(%d, arr[i]); }解释单层循环执行次数和数据量 n 完全成正比。场景数组遍历、链表遍历、顺序查找。补充单分支递归也是 O(n)int fact(int n) { if (n 1) return 1; return n * fact(n - 1); }解释每次递归只产生一个子任务只有一条递归链递归深度等于 n所以是 O(n)。2.4 O(n log n) 线性对数级最优排序复杂度核心特点分层拆分 每层遍历全部数据场景快速排序、归并排序、堆排序解释数据对半拆分 log n 层每层都要遍历全部 n 个元素总复杂度 n * log n。2.5 O(n²) 平方级大数据较慢核心特点两层循环嵌套for (int i 0; i n; i) { for (int j 0; j n; j) { sum; } }解释外层 n 次内层 n 次总执行 n*n 次。数据量大时耗时明显增加。场景冒泡排序、双重暴力匹配。2.6 O(n³) 立方级很慢核心特点三层循环嵌套for (int i 0; i n; i) for (int j 0; j n; j) for (int k 0; k n; k) c[i][j] a[i][k] * b[k][j];解释三层循环全部跑满总次数 n*n*n仅适合极小数据。场景矩阵乘法、三层暴力枚举。2.7 O(2^n) 指数级爆炸增长核心特点每次递归分出两个分支任务翻倍int f(int n) { if (n 2) return 1; return f(n-1) f(n-2); }解释每次递归产生两个新递归任务数量层层翻倍增长速度爆炸。区分重点单分支递归 O(n)多分支递归 O(2^n)场景暴力子集枚举、未优化递归。2.8 O(n!) 阶乘级最慢、几乎不可用核心特点枚举所有排列情况暴力到极致void perm(int arr[], int start, int n) { // 递归到底一组排列完成 if (start n) { return; } // 每个位置依次和后面所有元素交换 for (int i start; i n; i) { swap(arr[start], arr[i]); perm(arr, start 1, n); swap(arr[start], arr[i]); // 回溯复原 } }逐句通俗解释1. start 代表当前正在确定的数组位置2. for 循环让每个数字轮流站在当前 start 位置3. 固定当前位置递归处理下一个位置4. 回溯换回原数字继续尝试其他排列。复杂度原理n 个元素全排列总数量n × (n-1) × (n-2)... n!代码会跑完所有排列所以复杂度为 O(n!)。n 只要稍大运算量就是天文数字程序直接卡死。场景全排列、暴力旅行商问题。三、复杂度增速总对比数据量大时增长速度O(1) O(log n) O(n) O(n log n) O(n²) O(n³) O(2^n) O(n!)四、整体总结1. 优质效率项目常用O(1)、O(log n)、O(n)、O(n log n)速度稳定适配大数据。2. 低效多项式仅小数据可用O(n²)、O(n³)数据量稍微变大就会超时工作中必须优化。3. 暴力级工程基本不用O(2^n)、O(n!)增长速度爆炸仅用于教学演示。