思路:快排+二分法
像快排一样,但是每次排完需要与k进行比较,具体比较看代码。
1.由于一般排序是从小到大排的;
所以注意这里比较的时候是 n-i 与 k进行比较;
2.或者从大到小排,则比较 i+1 与 k的大小;

代码:

1. 从小到大排序:

class Finder {
public:
    int findKth(vector<int> a, int n, int K) {
        // write code here
        return quick_sort(a, 0, n - 1, n, K);
    }

    int quick_sort(vector<int>& a, int start, int end, int n, int k) {
        int base = a[start];
        int i = start;
        int j = end;
        int res = 0;

        while (i < j) {
            while (i<j && a[j]>=base) --j;
            while (i<j && a[i]<=base) ++i;
            if (i < j) swap(a[i], a[j]);
        }
        swap(a[start], a[j]);

        if (n - j == k) return a[j];
        else if (n - j < k) res = quick_sort(a, start, j-1, n, k);
        else if (n - j > k) res = quick_sort(a, j+1, end, n, k);
        return res;
    }
};

2. 从大到小排序:

class Finder {
public:
    int findKth(vector<int> a, int n, int K) {
        // write code here
        return quick_sort(a, 0, n - 1, n, K);
    }

    int quick_sort(vector<int>& a, int start, int end, int n, int k) {
        int base = a[start];
        int i = start;
        int j = end;
        int res = 0;

        while (i < j) {
            while (i < j && a[j] <= base) --j;
            while (i < j && a[i] >= base) ++i;
            if (i < j) swap(a[i], a[j]);
        }
        swap(a[start], a[i]);

        if (i+1 == k) return a[i];
        else if (i+1 > k) res = quick_sort(a, start, i-1, n, k);
        else if (i+1 < k) res = quick_sort(a, i+1, end, n, k);
        return res;
    }
};