目录
思路
第k大的数也就是升序数组中下标为n-k的元素。
只需要根据划分两边后,第 k大数会落在哪一边,来决定对哪边进行递归处理即可。
int qselect(vector<int>&nums,int l,int r,int k){
if(l==r) return nums[k];
int mid=nums[l];
int i=l-1,j=r+1;
while(i<j){
do j--;while(nums[j]>mid);
do i++;while(nums[i]<mid);
if(i<j)
swap(nums[j],nums[i]);
}
if(k<=j) return qselect(nums,l,j,k);
else return qselect(nums,j+1,r,k);
}
int findKthLargest(vector<int>& nums, int k) {
int n=nums.size();
int res=qselect(nums,0,n-1,n-k);
return res;
}
划分模板
void part(vector<int>& nums,int l,int r){//区间[l,j]的元素<=nums[l],区间[j+1,r]的元素>=nums[l]
int mid=nums[l],i=l-1,j=r+1;
while(i<j){
do i++; while(nums[i]<mid);
do j--; while(nums[j]>mid);
if(i<j)swap(nums[i],nums[j]);
cout<<"i="<<i<<" j="<<j<<endl;
}
}
快速排序模板
void qsort(vector<int>&nums,int l,int r){
if(l==r) return;
int mid=nums[l];
int i=l-1,j=r+1;
while(i<j){
do j--;while(nums[j]>mid);
do i++;while(nums[i]<mid);
if(i<j)
swap(nums[j],nums[i]);
}
qsort(nums,l,j);
qsort(nums,j+1,r);
}