
1) 【一句话结论】快速排序平均时间复杂度最优但最坏情况较差,空间复杂度低;归并排序时间复杂度稳定且空间复杂度较高,处理大数据量时归并排序更适合前端场景,因为其时间复杂度在所有情况下均稳定,能保证排序效率且有序性,而快速排序在数据无序或已有序时可能性能退化。
2) 【原理/概念讲解】
快速排序采用“分治”思想:首先选一个基准元素(pivot),将数组分为两部分——左边元素小于基准,右边元素大于基准;然后对左右子数组递归执行相同操作。时间复杂度方面,平均情况为O(nlogn)(类似分治的递归深度n,每次分区约分n/2个元素),最坏情况为O(n²)(如数组已有序且每次选第一个元素为基准,导致分区后子数组大小差异极大,递归深度达n);空间复杂度是递归栈空间,理想情况下为O(logn),最坏为O(n)。可类比为“分蛋糕”:每次选一个基准,把比它小的分到左边,大的分到右边,然后继续分左右两块。
归并排序同样基于“分治”:将数组分成两半,分别对左右半部分递归排序,再将两个有序半部分合并成一个有序数组。时间复杂度始终为O(nlogn)(分治的递归深度n,每次合并操作为O(n));空间复杂度为O(n)(需要额外数组存储合并结果);稳定性方面,相同元素的相对顺序不变(稳定)。可类比为“整理书架”:把书分成两堆,每堆先排序,然后按顺序合并到新书架上,确保顺序。
3) 【对比与适用场景】
| 算法 | 定义 | 时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| 快速排序 | 选基准分区,递归处理子数组 | 最好/平均O(nlogn),最坏O(n²) | O(logn)(递归栈) | 不稳定 | 数据量中等,内存充足,需快速排序 |
| 归并排序 | 分半排序后合并 | 最好/平均/最坏O(nlogn) | O(n) | 稳定 | 大数据量,需稳定排序,内存允许 |
4) 【示例】
快速排序伪代码:
function quickSort(arr, left, right) {
if (left < right) {
let pivotIndex = partition(arr, left, right);
quickSort(arr, left, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, right);
}
}
function partition(arr, left, right) {
let pivot = arr[right];
let i = left - 1;
for (let j = left; j < right; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, right);
return i + 1;
}
function swap(arr, i, j) { [arr[i], arr[j]] = [arr[j], arr[i]]; }
归并排序伪代码:
function mergeSort(arr) {
if (arr.length <= 1) return arr;
let mid = Math.floor(arr.length / 2);
let left = mergeSort(arr.slice(0, mid));
let right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
return result.concat(left).concat(right);
}
5) 【面试口播版答案】
“面试官您好,关于前端常用的排序算法,快速排序和归并排序是典型代表。快速排序的核心是分治思想,通过选基准元素分区,平均时间复杂度O(nlogn),但最坏情况会退化到O(n²),空间复杂度是递归栈的O(logn);归并排序也是分治,分半排序后合并,时间复杂度稳定在O(nlogn),空间复杂度需要额外O(n)存储,但它是稳定的排序算法。处理大数据量时,归并排序更适合前端场景,因为它的时间复杂度在所有情况都稳定,不会出现最坏情况退化的风险,而前端中如果数据量较大(比如需要排序的数组规模大),归并排序能保证排序效率且有序性,虽然空间占用多,但前端内存通常足够处理这类排序,而快速排序在数据无序或已有序时可能性能差,不适合大数据量。所以结论是归并排序更适合大数据量前端场景,因为时间复杂度稳定且能保证排序稳定性。”
6) 【追问清单】
7) 【常见坑/雷区】