Algorithm JS中的快速选择

Algorithm JS中的快速选择,algorithm,recursion,Algorithm,Recursion,数组中第k个最大元素,我被基本情况卡住了。考虑到lastElement是最好的选择,我想我找到轴心点的逻辑是正确的,有人能帮我吗?对于一些输入,它将无限大 const swap = function(arr,id1,id2){ const temp = arr[id1]; arr[id1] = arr[id2]; arr[id2] = temp; }; const pivot = function(nums){ let firstIdx = 0; le

数组中第k个最大元素,我被基本情况卡住了。考虑到lastElement是最好的选择,我想我找到轴心点的逻辑是正确的,有人能帮我吗?对于一些输入,它将无限大

const swap = function(arr,id1,id2){
    const temp = arr[id1];
    arr[id1] = arr[id2];
    arr[id2] = temp;
};

const pivot = function(nums){

    let firstIdx = 0;
    let lastIdx = nums.length-1;

    // lets consider last element
    for(let i = firstIdx ; i< lastIdx;i++){
        if(nums[i] > nums[lastIdx]){
            swap(nums,firstIdx,i);
            firstIdx++;
        }
    }
    swap(nums,firstIdx,lastIdx);
    
    return firstIdx;
}



const kThLargestElement = function(nums, m){


    if(nums.length === 1) return nums[0];
    let guess = pivot(nums);
    //console.log(`guess : ${guess},m: ${m},nums: ${nums}`);
    
    if(guess > m) return kThLargestElement(nums.slice(0,guess),m);
    if(guess < m) return kThLargestElement(nums.slice(guess+1,nums.length),m);
   
    return nums[m];


}

const selection = function(arr,k){
    return kThLargestElement(arr,k-1);
}

console.log(selection([6,-2,1,8,7,5],6));
 //console.log(pivot([6,-2,1,8,7,5]));
const swap=函数(arr、id1、id2){
常数温度=arr[id1];
arr[id1]=arr[id2];
arr[id2]=温度;
};
常量轴=函数(nums){
设firstIdx=0;
设lastIdx=nums.length-1;
/让我们考虑最后一个元素
for(设i=firstIdx;inums[lastIdx]){
交换(nums、firstIdx、i);
firstIdx++;
}
}
交换(nums、firstIdx、lastIdx);
返回第一个IDX;
}
常数kThLargestElement=函数(nums,m){
if(nums.length==1)返回nums[0];
让猜测=支点(nums);
//log(`guess:${guess},m:${m},nums:${nums}`);
如果(guess>m)返回kThLargestElement(nums.slice(0,guess),m);
如果(猜测
我认为,如果使用切片进行此操作,则需要调整传入递归调用的
m
:假设数组为[1,2,4,5,3],并且您正在查找索引=4,那么对于切片[4,5]的递归调用,您不再查找索引4,而是查找索引4-3(3是轴之前(包括轴)左侧的值数)。