给出一个数组,找出数组的第k大的数:基于快速排序的思路,每次快排后,基准的左边都是比其小的数,右边都是比其大的数,一次快排结束后,若基准所处的位置正好是第k大(即基准右边有k-1个数据),则返回基准值。若基准所在的位置右边的数据小于k-1个,说明第k大的数在基准左边序列中,则我们需要对左边的数据进行快排,并找到第k-big-1大的数据;若基准所在的位置右边的数据大于k-1个,说明第k大的数在基准右边序列中,则对右边的序列进行快排并找到第k大的数。
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
// write code here
return quickFind(a, 0, n-1,K);
}
int quickFind(vector<int>& arr,int left,int right,int k){
int i=left,j=right,key=arr[left];
while(i<j){
while(i<j&&arr[j]>=key) j--;
arr[i]=arr[j];
while(i<j&&arr[i]<=key) i++;
arr[j]=arr[i];
}
arr[i]=key;
int big=right-i;
if(big==k-1) return key;
else if(big<k-1)
return quickFind(arr, left, i-1,k-big-1);
else
return quickFind(arr,i+1, right,k);
}
};