【算法】利用快排的思想找出数组中第K大的十数字

52 阅读1分钟

let tests = [3, 2, 2, 1, 4, 5, 6, 11, 8, 9, 7, 10];

function quickSelect(arr, k) {
    if (arr.length <= 1) {
        return arr[0];
    }
    // 确定分区的主元,默认选择第一个元素
    let partition = arr[0];
    let left = [];
    let right = [];

    // 从第二个元素开始分区
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < partition) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }

    // 如果左边数组的长度等于 k-1,那么主元就是第 k 大的值
    if (left.length === k - 1) {
        return partition;
    }
    // 如果右边数组的长度大于等于 k,那么第 k 大的值在右边数组中
    if (left.length >= k) {
        return quickSelect(left, k);
    }
    // 否则,第 k 大的值在左边数组中,注意调整 k 的值
    return quickSelect(right, k - left.length - 1);
}

// 找到第 k 大的值
let k = 9; // 例如,找第 9 大的值
let kthLargest = quickSelect(tests, k);
console.log(`第 ${k} 大的值是: ${kthLargest}`); // 输出第 9 大的值