一、数组第k大的元素
思路:1.快排
2.大顶堆(手撕堆)
//手撕堆排
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) { //手撸大根堆
for(int i=nums.size()/2-1;i>=0;i--){ //第一次从nums.size()/2-1开始调整初始化原始大顶堆
adjust(nums,nums.size(),i);
}
for(int i=nums.size()-1;i>nums.size()-k;i--){ //后续从末尾开始交换堆顶和堆尾元素。
swap(nums[0],nums[i]);
adjust(nums,i,0);
}
return nums[0];
}
void adjust(vector<int>& nums,int len,int root){ //核心就是堆调整函数
int child_left=2*root+1;
int child_right=2*root+2;
int Max=root;
if(child_left<len && nums[child_left]>nums[Max]) Max=child_left;
if(child_right<len && nums[child_right]>nums[Max]) Max=child_right;
if(Max==root) return;
swap(nums[root],nums[Max]);
adjust(nums,len,Max);
}
};
//快排
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) { //快排
return quick_sort(nums,k,0,nums.size()-1);
}
int quick_sort(vector<int>& nums, int k,int l,int r){
int left=l,right=r;
while(left<right){
while(left<right && nums[right]>=nums[l]) right--;
while(left<right && nums[left]<=nums[l]) left++;
swap(nums[left],nums[right]);
}
swap(nums[left],nums[l]);
if(nums.size()-left>k) return quick_sort(nums,k,left+1,r);
if(nums.size()-left<k) return quick_sort(nums,k,l,left-1);
else return nums[left];
}
};