常用算法的时间复杂度
常见时间复杂度类型
| 类型 |
名称 |
运行1s,n的最大值 |
| \(O(1)\) |
常数复杂度 |
/ |
| \(O(\log_{2}n)\) |
对数复杂度 |
特别大,几乎无需考虑 |
| \(O(n)\) |
线性复杂度 |
\(10^7\) |
| \(O(n\log_{2}n)\) |
线性对数复杂度 |
\(10^6\) |
| \(O(n^2)\) |
平方复杂度 |
\(5000\) |
| \(O(2^n)\) |
指数复杂度 |
\(25\) |
| \(O(n!)\) |
阶乘复杂度 |
\(11\) |
排序算法
| 算法名称 |
平均时间复杂度 |
最坏时间复杂度 |
稳定性 |
| 选择排序 |
\(O(n^2)\) |
\(O(n^2)\) |
不稳定 |
| 冒泡排序 |
\(O(n^2)\) |
\(O(n^2)\) |
稳定 |
| 插入排序 |
\(O(n^2)\) |
\(O(n^2)\) |
稳定 |
| 快速排序 |
\(O(n\log_2n)\) |
\(O(n^2)\) |
不稳定 |
| 计数排序 |
\(O(n+m)\) |
\(O(n+m)\) |
稳定 |
| 基数排序(k为基数) |
\(O(log_2n(n+k))\) |
\(O(log_2n(n+k))\) |
稳定 |
| 堆排序 |
\(O(n\log_2n)\) |
\(O(n\log_2n)\) |
不稳定 |
总结:在基础的排序算法中,只有选择排序、快速排序是不稳定排序。计数排序、基数排序属于不基于比较的排序,其他基于比较。
注意:稳定排序指相同的多个数排序后顺序不变。
图论
最短路
| 算法名 |
时间复杂度(n点m边) |
| Floyd |
\(O(n^3)\) |
| Dijkstra |
\(O(n^2)\) |
| Dijkstra的堆优化 |
\(O((m+n)\log_{2}n)\) |
| Bellman-ford |
\(O(mn)\) |
最小生成树
| 算法名 |
时间复杂度(n点m边) |
| kruskal |
\(O(m\log_2m)\) |
| prim |
\(O(n^2)\) |
| boruvka |
\(O(m\log_2n)\) |