// 5、快速排序
function quickSort(arr, left = 0, right = arr.length - 1) {
// 定义递归边界,若子数组只有一个元素,则没有排序必要
if (arr.length > 1) {
// 计算当前数组的基准值
const nextPivot = partition(arr, left, right)
// 如果左边子数组的长度不小于1,则递归快排这个子数组
if (left < nextPivot - 1) {
quickSort(arr, left, nextPivot - 1)
}
// 如果右边子数组的长度不小于1,则递归快排这个子数组
if (nextPivot < right) {
quickSort(arr, nextPivot, right)
}
}
return arr
}
// 寻找基准值的过程
function partition(arr, left, right) {
// 基准值默认值
// const pivot = arr[left];
const pivot = arr[Math.floor(left + (right - left) / 2)]
// const pivot = getPivot(arr, left, right);
// 当左右指针不越界时,循环执行以下逻辑
while (left <= right) {
// 左指针所指元素若不大于基准值,则右移左指针
while (arr[left] < pivot) {
left++
}
// 右指针所指元素若不小于基准值,则左移右指针
while (arr[right] > pivot) {
right--
}
// 若i<=j,则意味着基准值左边存在较大元素或右边存在较小元素,交换两个元素确保左右两侧有序
if (left <= right) {
[arr[left], arr[right]] = [arr[right], arr[left]];
left++
right--
}
}
// 返回左指针索引作为下一个基准值的索引
return left;
}