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);

参考

猜你喜欢

转载自blog.csdn.net/qq_44742090/article/details/123884252