快速排序(从大到小排序)每一趟都能保证基准左边的数都比基准大,基准右边的数都比基准小。设基准的位置为i,则基准为第i+1大,若k等于i+1则符合条件退出。若i+1>k则说明第k大的数在基准左边,否则在右边。

class Solution {
public:
    int findKth(vector<int> a, int n, int K) {
        // write code here

        //将数组首元素作为每一轮比较的基准,比基准大的数放在左边,比基准小的数放在右边
        return find(a, 0, n-1, K);
    }

    int find(vector<int>& a, int left, int right, int K)
    {
        int pivot = parti(a, left, right);

        if(pivot + 1 < K)
            return find(a, pivot+1, right, K);
        else if(pivot + 1 > K)
            return find(a, left, pivot-1, K);
        else
            return a[pivot];
    }

    int parti(vector<int>& a, int left, int right)
    {
        int tmp = a[left];

        int i=left;
        int j=right;
        while(i < j)
        {
            //从右边开始找到第一个比基准大的数的位置;
            //在下面的循环中若a[j] > tmp就会退出while循环,j就是位置;
            while(i < j && a[j] <= tmp)
            {
                j--;
            }
            //从左边开始找到第一个比基准小的数的位置;
            //在下面的循环中若a[i] < tmp就会退出while循环,i就是位置;
            while(i < j && a[i] >= tmp)
            {
                i++;
            }

            if(i < j)
            {
                //交换;
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }

        //首元素与基准交换;
        a[left] = a[i];
        a[i] = tmp;

        return i;
    }
};