leetcode-快排找第K大元素(JS)

快速排序,找到第 K 个最大元素

每进行一次快速排序的 partFun操作,就能找到这次我们选中的基准值排序之后的正确位置。

如果它的位置刚好是排序之后第 K 个最大元素的位置,即 length - k,我们直接得到了答案;
因为进行 partition 操作之后,位于基准值之前的元素都要小于基准值,位于基准值之后的元素都要大于等于基准值。

  • 如果它的位置小于排序之后第 K 个最大元素的位置,我们就去它之后寻找第 K 个最大元素;
  • 如果它的位置大于排序之后第 K 个最大元素的位置,我们就去它之前寻找第 K 个最大元素;
const arr = [1,5,3,9,6,4,2];
function quickSort(arr, k,left, right) {
    let tagIndex = arr.length - k;
    let leftN, rightN, pivotIndex;
    leftN = typeof left != 'number' ? 0 : left;
    rightN = typeof right != 'number' ? arr.length - 1 : right;
    if (leftN < rightN) {
        pivotIndex = partFun(arr, leftN, rightN);
        console.log(tagIndex,pivotIndex);
        if(tagIndex == pivotIndex) {
            console.log("找到了",tagIndex)
            return arr[tagIndex]
        }else if(tagIndex > pivotIndex) {
            console.log('大于');
            quickSort(arr,k, pivotIndex + 1, rightN);
        }else {
            console.log('小于');
            quickSort(arr, k,leftN, pivotIndex - 1);
        }
    }

    return arr[tagIndex];//一定不能漏,否则报错
}

function partFun(arr, left, right) {
    let pivot = left;
    let index = left + 1;
    for (let i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            swap(arr, i, index)
            index++
        }
    }
    swap(arr, pivot, index - 1)
    return index - 1;
}


function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

const arrN = quickSort(arr,3);
console.log(arrN);

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值