给出一个数组,找出数组的第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 herereturn 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);elsereturn quickFind(arr,i+1, right,k);}
};