冒泡 · 选择 · 插入 · 快排 · 归并 · 计数 · 堆排 · 复杂度对比
| 算法 | 平均时间 | 最坏时间 | 空间 | 稳定性 | 面试频率 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 | ★★★ 必背 |
| 选择排序 | O(n²) | O(n²) | O(1) | 不稳定 | ★★ 了解 |
| 插入排序 | O(n²) | O(n²) | O(1) | 稳定 | ★★★ 必背 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不稳定 | ★★★★★ 必考 |
| 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 | ★★★★ 高频 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 | ★★★ 高频 |
| 计数排序 | O(n+k) | O(n+k) | O(k) | 稳定 | ★★ 进阶 |
| 希尔排序 | O(n log² n) | O(n²) | O(1) | 不稳定 | ★ 了解 |
思路:相邻两个元素比较,大的往后挪,每轮把最大的"冒泡"到末尾。像水底气泡上浮。
a.length - 1 - i,因为末尾 i 个已经排好。swapped 优化能让最好情况变 O(n)。思路:每轮从未排序部分找最小值,放到已排序部分的末尾。
思路:像整理扑克牌,把新牌插入到已排序的合适位置。对小数据或近乎有序的数组最快。
思路:选一个基准(pivot),比它小的放左、大的放右,递归排左右两部分。面试必考 TOP1。
思路:先拆成单元素(有序),再两两合并成有序数组。稳定排序,链表排序首选。
merge 函数合并两个有序数组,是归并、外排序的基础。注意 left[i] <= right[j] 保证稳定性(相等时取左边)。思路:用数组下标表示值,统计每个值出现次数。仅适用于值范围不大的整数。
思路:先建成大顶堆,再把堆顶(最大值)和末尾交换,缩小堆,重新调整。原地排序,空间 O(1)。
面试追问:"你说的排序我都懂,那 Array.sort 底层用什么算法?"——能答出这个就是高级前端。
场景:找出 100 万数据中最大的 10 个。用小顶堆维护 K 个元素,比全排序快得多。