数组中的第K个最大元素尝试快排

来源:3-5 三路快排partition思路的应用 Sort Color

慕粉3884565

2021-08-01

/**
 * 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
 * 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    if(k>nums.length){
        return -1;
    }
    if(nums.length<2){
        return 1;
    }
    let middle = partition(nums,0,nums.length-1);
    let last = nums.length-k;
    let list =[];
    if(last>middle){
        let sliceArray = nums.slice(middle)
        list = sort(sliceArray,0,sliceArray.length-1);
        return list[list.length-k];
    }else if(last<middle){
        let sliceArray = nums.slice(0,middle)
        list = sort(sliceArray,0,sliceArray.length-1);
        let surplusR = nums.length-middle;
        k = k-surplusR;
        return list[list.length-k];
    }else{
        return nums[middle];
    }
    return -1;
};

function partition(arr, left, right) {
    let index =left;
    let middle = arr[right];
    for(let i=left;i<arr.length;i++){
        if(arr[i]<middle){
            [arr[i],arr[index]] = [arr[index], arr[i]];
            index++;
        }
    }
    [arr[index],arr[right]] = [arr[right],arr[index]];
    return index;
}
function sort(arr, left, right) {
    if(left>right){
        return;
    }
    let middle = partition(arr,left,right);
    sort(arr, left, middle-1);
    sort(arr, middle+1,right);
    return arr;
}
let arr= [3,2,3,1,2,4,5,5,6];
findKthLargest(arr, 4,);

哎结果呢,花时间比较长http://img.mukewang.com/szimg/6106782209f116df07850168.jpg

老师就是根据现在学的单纯通过数组排序是不是只能到这个成都

写回答

1回答

liuyubobobo

2021-08-01

类似 js 这类语言的问题在于,解释器的执行对算法的影响是巨大的,同时解释器底层对标准库的优化,使得调用标准库远远快于自己写底层逻辑。所以一个理论上更优的算法,在这类脚本语言上,很有可能表现结果更差。


你试一下,我估计你排一下序,直接取第k 大元素,比这样写快多了。


所以,对于计算机专业的学生,我向来不建议使用脚本语言学习算法。包括 python。当然,学习算法逻辑没有问题,但是使用脚本语言测试算法性能,会产生很多类似这样的问题。不是说 C++ 或者 Java 没有这类问题,但比脚本语言好很多;


继续加油!:)

0
3
慕粉3884565
非常感谢!
2021-08-02
共3条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程