有用例不通过,快排退化的时候不通过! 这里用一点小技巧防止快排退化。

class Solution {
  public:
    int findKth(vector<int> a, int n, int K) {
      return quick_sort(a, 0, a.size() - 1, K);
    }
  private:
    int quick_sort(std::vector<int> &res, int low, int high, int k) {
      int i = low, j = high, target = (low + high) >> 1;
        //  防止快排退化
      std::swap(res[low], res[target]);
      
      while (i < j) {
        while (i < j && res[i] >= res[low]) {
          ++i;
        }
        while (i < j && res[j] <= res[low]) {
          --j;
        }
        
        if (i < j) {
          std::swap(res[i++], res[j--]);
        }
      }
      
      if (res[i] < res[low]) {
        --i;
      }
      
      std::swap(res[i], res[low]);
      
      if (i - low + 1 == k) {
        return res[i];
      }
      
      if (i - low + 1 > k) {
        return quick_sort(res, low, i - 1, k);
      } else {
        return quick_sort(res, i + 1, high, k - (i - low + 1));
      }
    }
};