acwing 786. 第k个数-原理。快速选择

acwing 786. 第k个数

题意

  • 从小到大,第K个数。注意是第k个数

想法

  • 快速选择算法
  • 快排的每一趟,数轴的左边都会是 <= x 的, 右边都是 >= x 的。
  • 左边元素的个数是 s1 = j - l + 1, 如果k <= s1 的话,那么下次递归的区间就是左边的第k个
  • k > s1的话,那么这个数一定在右边的第 k -s1个数。
  • 直到 l == r 时返回q[l]。(会保证第k小的数一直在递归的区间中,那么当区间里只有一个数的时候,就一定是要找的数了。)

acwing 786. 第k个数-原理。快速选择_第1张图片

//
//https://www.luogu.com.cn/problem/P1138
// 快速选择

#include 
using namespace std;

int n,k;
int a[10000100];

int qsort(int l ,int r,int k){

    //会保证第k小的数一直在递归的区间中,那么当区间里只有一个数的时候,就一定是要找的数了
    if (l == r) return a[l];
    int i = l-1 , j = r+1, x =a[l];
    while (i < j){
        do i++ ; while (a[i] < x);
        do j--; while (a[j] > x);
        if( i < j ) swap(a[i],a[j]);
    }

    int s1 = j - l + 1;
    if(k <= s1) return qsort(l, j, k);
    else return qsort(j + 1, r, k - s1);
}
int main(){

    cin >> n >> k;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    cout << qsort(0,n-1,k);
    return 0;
}

你可能感兴趣的:(二分和排序,算法,快速选择)