核心思想:使用分治法把一个序列(list)分为较小和较大的两个子序列,然后递归地排序两个子序列
步骤:
- 从数列中挑出一个元素,称为 “基准”(pivot)
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
分析:
- 时间复杂度: 平均时间复杂度是 O(nlogn),但最坏情况下会退化到 O(n2)(例如数组已经有序时)
- 空间复杂度: 快速排序的空间复杂度是 O(logn),因为递归调用栈的深度为 O(logn)
实现代码
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
let pivot = arr[Math.floor(arr.length / 2)];
let left = [];
let right = [];
for (let i = 0; i < arr.length; i++) {
if (i === Math.floor(arr.length / 2)) continue;
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat(pivot, quickSort(right));
}
let array = [5, 3, 8, 4, 2];
console.log(quickSort(array)); // 输出: [2, 3, 4, 5, 8]