/*
用快排的划分算法定义一个基准点pos然后[i,j]区间遍历,
在区间左边找到一个比基准点大的数右边找到一个比基准点小的数交换
这样就能确定基准点右边都是比它大,左边都是比他小的区间,最后交换基准点与
l1的位置那个这个pos就是整个区间的第l1大,这时候比较l1与k的大小选择去左边
还是右边递归
*/
class Solution {
public:
int ans;
void qsort(vector<int>& nums,int l,int r,int k)
{
int pos=r;
int l1=l;
int r1=r;
while(l1 < r1)
{
while(l1 < r1 && nums[l1] <= nums[pos]) l1++;
while(l1 < r1 && nums[r1] >= nums[pos]) r1--;
if(l1 < r1) swap(nums[l1],nums[r1]);
}
swap(nums[l1],nums[pos]);
if(l1 == k)
{
ans=nums[l1];
return;
}
else if(l1 > k) qsort(nums,l,l1-1,k);
else qsort(nums,l1+1,r,k);
}
int findKthLargest(vector<int>& nums, int k) {
int n=nums.size();
qsort(nums,0,n-1,n-k);
return ans;
}
};
void qsort(int num[],int l,int r)
{
if(l >= r) return;
int p=r;
int l1=l;
int r1=r;//注意r的起始位置
while(l1 < r1)
{
while(num[l1] <= num[p] && l1 < r1) l1++;
while(num[r1] >= num[p] && r1 > l1) r1--;
if(l1 < r1) swap(num[l1],num[r1]);
}
swap(num[l1],num[p]);//替换基准点
qsort(num,l,p-1);
qsort(num,p+1,r);
}