算法核心知识复习:排序算法对比 + 递归与递推深度解析(根据GESP四级题目总结)
算法核心知识复习:排序算法对比 + 递归与递推深度解析
摘要:本文整合排序算法的复杂度/稳定性对比,以及递归与递推的核心区别,助你高效备战面试与考试!
一、排序算法关键特性对比
排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
冒泡排序 | 最坏/平均:O(n²);最好:O(n) | O(1) | 稳定 ✅ |
选择排序 | 最坏/平均/最好:O(n²) | O(1) | 不稳定 ❌ |
插入排序 | 最坏/平均:O(n²);最好:O(n) | O(1) | 稳定 ✅ |
归并排序 | 最坏/平均/最好:O(n log n) | O(n) | 稳定 ✅ |
快速排序 | 最坏:O(n²);平均/最好:O(n log n) | 平均 O(log n),最坏 O(n) | 不稳定 ❌ |
堆排序 | 最坏/平均/最好:O(n log n) | O(1) | 不稳定 ❌ |
基数排序 | 最坏/平均/最好:O(nk)★ | O(n + k) | 稳定 ✅☆ |
关键说明:
- 稳定性:稳定算法保持相等元素的原始顺序(如冒泡排序),不稳定算法可能打乱顺序(如选择排序)。
- 基数排序:★
k
为最大数字的位数;☆需配合稳定的桶排序(如计数排序)。- 快速排序:实际应用中效率高,但最坏情况(如已排序数组)性能退化。
二、递归 vs 递推:本质区别与适用场景
1. 递归(Recursion)
- 核心思想:自顶向下分解问题,通过函数调用自身解决子问题(如树形结构)。
- 特点:
- ✅ 代码简洁(如阶乘:
n! = n * (n-1)!
)。 - ❌ 栈溢出风险(深度过大)、函数调用开销高。
- ✅ 代码简洁(如阶乘:
- 经典应用:二叉树遍历、汉诺塔问题。
2. 递推(迭代/动态规划)
- 核心思想:自底向上构建解,通过已知解逐步推导未知解(如填表法)。
- 特点:
- ✅ 无栈溢出风险、性能更优(减少函数调用)。
- ❌ 逻辑可能更复杂(需设计状态转移方程)。
- 经典应用:斐波那契数列(DP版)、爬楼梯问题。
3. 对比总结
特性 | 递归 | 递推 |
---|---|---|
问题分解 | 分解为相同子问题(分治) | 分解为相互依赖的子问题(递推式) |
方向 | 自顶向下 → 从目标到基线条件 | 自底向上 → 从基线到目标 |
性能 | 较差(栈开销) | 更优(无调用开销) |
适用场景 | 问题逻辑天然递归(如DFS) | 子问题重叠(如DP问题) |
形象比喻:
- 递归:站在山顶拆解任务(大问题→小问题),直到山脚直接解决。
- 递推:从山脚逐步搭建阶梯(小解→大解),最终登顶。
三、如何选择?实战建议
- 排序算法:
- 优先快速排序(平均高效)、归并排序(稳定且O(n log n))。
- 小规模数据用插入排序(常数项低)。
- 递归/递推:
- 递归 → 代码简洁性优先(如非性能瓶颈)。
- 递推 → 性能关键场景(如DP优化斐波那契)。
- 递归转递推:多数递归可用备忘录或迭代DP优化!