问题描述:在数组中找到第 k 大的元素。要求时间复杂度为O(n),空间复杂度为O(1)
分析:此类问题为排序问题,主要难点在于时间复杂度为O(n),采用快速排序算法进行排序
function quickSort(nums,k,start,end){
if(start>=end){
return nums[k];
}
var left=start,right=end;
var key=nums[Math.floor((start+end)/2)];
while(left<=right){
while(left<=right&&nums[left]<key){
left++;
}
while(left<=right&&nums[right]>key){
right--;
}
if(left<=right){
swap(nums,left,right)
left++;
right--;
}
}
if(k<=right){
return quickSort(nums,k,start,right)
}
if(k>=left){
return quickSort(nums,k,left,end)
}
return nums[k];
}
function swap(nums,i,j) {
var tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
1、基数的选择影响时间复杂度,O(选最左边的为基数)>O(选最中间的数为基数),一般来说当块划分的相对平均的时候时间复杂度较低
2、js中/得出的结果为实际值,如果要取整需要使用相应的函数如(parseInt丢弃小数部分,保留整数,floor向下取整,round四舍五入,ceil向上取整)