ACwing-786-第k个数-快排思想

ACwing-786-第k个数-快排思想_第1张图片
ACwing-786-第k个数-快排思想_第2张图片

  • 快排思想的运用。因为快排每次可以确定一个元素的最终位置,那么只要确定了第k个数字的位置,递归就可以结束了。
// 第k个数
#include 
using namespace std;
const int N = 100010;
int n, k, a[N];

int quickFind (int l, int r, int k) {
    // 1. 前半部分和快排完全相同: 找到第k个位置了
    if (l == r ) return a[r];
    // 1.1 以x为枢轴,一次快排的内容
    int i = l - 1, j = r + 1, x = a[l + r >> 1];
    while (i < j) {
        // do i++; while (a[i] < x);
        while (a[++i] < x);
        //do j--; while (a[j] > x);
        while (a[--j] > x);
        if (i < j) swap(a[i], a[j]);
    }
    // 2. 左半边的长度
    int SL = j - l + 1;
    // 2.1 左半边太长了,去左半边找
    if (SL >= k ) return quickFind(l, j, k);
    // 2.2 左半边太短了,去右边找,此时只要去找第K-SL数
    else return quickFind(j + 1, r, k - SL);
}
int main() {
    // 3. 输入n,k,初始化数组
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> a[i];
    // 4.直接打印出第k个数
    cout << quickFind(0, n - 1, k) << endl;
    return 0;
}


你可能感兴趣的:(leetcode,算法)