数组中的第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,);哎结果呢,花时间比较长
老师就是根据现在学的单纯通过数组排序是不是只能到这个成都
写回答
1回答
-
类似 js 这类语言的问题在于,解释器的执行对算法的影响是巨大的,同时解释器底层对标准库的优化,使得调用标准库远远快于自己写底层逻辑。所以一个理论上更优的算法,在这类脚本语言上,很有可能表现结果更差。
你试一下,我估计你排一下序,直接取第k 大元素,比这样写快多了。
所以,对于计算机专业的学生,我向来不建议使用脚本语言学习算法。包括 python。当然,学习算法逻辑没有问题,但是使用脚本语言测试算法性能,会产生很多类似这样的问题。不是说 C++ 或者 Java 没有这类问题,但比脚本语言好很多;
继续加油!:)
032021-08-02
相似问题