
1) 【一句话结论】
快速排序平均时间复杂度O(n log n),最坏情况因基准选择不当为O(n²);归并排序稳定时间复杂度O(n log n),但需O(n)额外空间。教育平台课程列表排序需结合分页/懒加载减少全量排序,动态更新时采用增量排序(如Timsort)或维护排序索引,结合虚拟滚动优化前端渲染性能。
2) 【原理/概念讲解】
时间复杂度衡量算法执行时间随输入规模n的增长趋势,用大O表示。快速排序(Quick Sort)采用“分治”思想:选基准元素(如数组最后一个值),通过分区操作将数组分为“小于基准”“等于基准”“大于基准”三部分,递归排序左右子区间;归并排序(Merge Sort)也是“分治”:将数组分成两半,递归排序后合并两个有序数组。快速排序的分区步骤中,若基准选择不当(如每次选最小或最大元素),会导致分区极不平衡,递归深度达到n,时间复杂度变为O(n²)。归并排序通过合并两个有序数组得到最终有序结果,过程中需要额外辅助数组存储中间结果,因此空间复杂度为O(n)。
3) 【对比与适用场景】
| 算法 | 定义 | 时间复杂度(平均/最坏) | 稳定性 | 空间复杂度 | 适用场景 | 注意点 |
|---|---|---|---|---|---|---|
| 快速排序 | 分治+分区 | 平均O(n log n),最坏O(n²) | 不稳定 | O(log n)(递归栈) | 小数据量、需频繁排序 | 基准选择影响性能,最坏情况需规避 |
| 归并排序 | 分治+合并 | 平均/最坏O(n log n) | 稳定 | O(n)(辅助数组) | 大数据量、需稳定排序 | 空间开销较大,适合内存充足场景 |
4) 【示例】
假设课程列表是数组courses = [{id:1,热度:100},{id:2,热度:50},{id:3,热度:150}],按热度降序排序。
function quickSort(arr, left, right) {
if (left < right) {
const pivotIndex = partition(arr, left, right);
quickSort(arr, left, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, right);
}
}
function partition(arr, left, right) {
const pivot = arr[right].热度;
let i = left - 1;
for (let j = left; j < right; j++) {
if (arr[j].热度 >= pivot) { // 降序,大于等于基准
i++;
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
[arr[i + 1], arr[right]] = [arr[right], arr[i + 1]];
return i + 1;
}
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
const result = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (left[i].热度 >= right[j].热度) {
result.push(left[i]);
i++;
} else {
result.push(right[j]);
j++;
}
}
return result.concat(left.slice(i)).concat(right.slice(j));
}
前端渲染优化:先对整个课程列表排序,然后根据当前页码(如页码1,每页10条)截取数据(如排序后数组的前10条),结合虚拟滚动,只渲染视口内的课程(如滚动时动态加载下一页数据)。
5) 【面试口播版答案】
快速排序和归并排序的时间复杂度,快速排序平均是O(n log n),最坏情况因为基准选择不当(比如每次选最小元素导致分区极不平衡)变成O(n²);归并排序是稳定的O(n log n),但需要额外空间。教育平台课程列表按热度排序,比如首页展示几十条,用快速排序高效,然后分页渲染,避免全量排序影响性能;如果搜索结果几百条,归并排序的稳定性更好,比如按评分排序后还要按热度排序,归并排序能保持原始顺序。前端渲染时,先对整个课程列表排序,然后根据当前页码和每页数量截取数据,结合虚拟滚动,只渲染当前页的数据,减少DOM操作。如果课程列表有动态更新(比如实时热度变化),可以用Timsort(结合归并和插入排序)或维护排序索引,只对更新部分重新排序,减少计算量。
6) 【追问清单】
7) 【常见坑/雷区】