第K大,题目要求使用快排的思想。那么先用快排实现,然后在优化。
写一个快排排序,然后取排序后的第K大的数。
还没完啊,先分析一下:
1.输入一个数组,一个range的其起始位置跟结束位置,随便找一个哨兵,那么进行一番操作之后,
比哨兵大的数都放到右边,比哨兵小的数都放到左边。
2.假设第一次操作完成,右边比哨兵大的数有len个,那么如果len小于K,右边肯定不需要继续排序了,因为第K大的数肯定在左边,
而且在左边的第K-len-1大的数,(需要排除哨兵,多减去一个1)。如果len比K大,那么左边不需要排序了,第K大的数肯定在右边。
3.递归的找下去。处理好边界。


class Solution {
public:    
    int findKth(vector<int> a, int n, int K) {
        // write code here
        if(a.size() < K){
            return -1;
        }
        
        quikSort(a, 0, n-1,K);
        return a[n-K];
    }
    
    void quikSort(vector<int> &a,int left,int right,int k){
        if(left > right || k <= 0){
            return;
        }
       
        int i = left,j = right;
        int base = a[left];
        
        while(i < j){
            while(a[j] > base && i < j){
                j--;
            }
            
            while(a[i] <= base && i < j){
                i++;
            }
            
            if(i < j){
                swap(a[i], a[j]);
            }
        }
        
        a[left] = a[i];
	    a[i] = base;
        
        int len = right - i;
        if(len > k-1){
            quikSort(a, i+1, right,k);
        }else if(len < k-1){
            quikSort(a, left, i-1,k-len-1);
        }
    }
};