SOURCE

/**
 * 快速排序(原地排序,取最右侧元素作为基准)
 * @params {number[]} arr 待排序数组
 * @params {number} left 当前处理区间左边界下标,默认0
 * @params {number} right 当前处理区间右边界下标,默认数组最后一位下标
 * @returns {number[]} 排序后的原数组
 */
function quickSort(arr, left = 0, right = arr.length - 1) {
    // 递归终止条件:区间只有0个或者1个元素,无需排序
    if (left >= right) return arr
    // 分区:返回基准元素最终所在下标
    const pivot = partition(arr, left, right)
    // 递归处理基准左侧区间
    quickSort(arr, left, pivot - 1)
    // 递归处理基准右侧区间
    quickSort(arr, pivot + 1, right)
    return arr
}
/**
 * 分区函数:把区间内小于基准的值放在左边,大于等于的放右边
 */
function partition(arr, left, right) {
    // 选取区间最右侧的值作为基准值
    const baseVal = arr[right]
    // 下一个存在【小于基准值】元素的位置
    let index = left
    // 遍历区间,逐个和基准值比较
    for (let i = left; i < right; i++) {
        // 当前元素小于基准值,交换到index位置,index右移
        if (arr[i] < baseVal) {
            [arr[index], arr[i]] = [arr[i], arr[index]]
            index++
        }
    }
    // 循环结束后,index左边全部小于基准值
    // 将基准元素放到index位置,此时index就是基准的最终位置
    [arr[index], arr[right]] = [arr[right], arr[index]]
    return index
}

console.log(quickSort([3, 5, 2, 7, 6, 4]))
console 命令行工具 X clear

                    
>
console