题目:
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n 个整数。
输出格式
输出一个整数,表示数列的第 k 个数。
输入样例:
5 3
2 4 1 5 3
输出样例:
3
/*
快速选择,快选
步骤:
1.同理快速排序,以数组中一个点的值为标准划分成左右两边
2.记左边的总数为sl
如果k<=sl,说明k在左边,只需要递归左边
如果k>sl,说明k在右边,只需要递归右边,此时k=k-sl;
*/
#include <iostream>
using namespace std;
int n,k;//数组个数和第k个数
const int N = 1e6;//最大数量
int q[N];
int quick_sort(int l, int r, int k)
{
if(l >= r) return q[l]; //只有一个数
//找分界点x
int x = q[l + (r - l >> 1)], i = l - 1, j = r + 1;
//分界
while(i < j)
{
while(q[++i] < x);//先++,后q[i]
while(q[--j] > x);
if(i < j) swap(q[i], q[j]);
}
//选择一边进行递归
int sl = j - l + 1;
if(k <= sl) return quick_sort(l, j, k);
else return quick_sort(j+1, r, k - sl);
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i++) cin >> q[i];
cout << quick_sort(0, n-1, k) << endl;
return 0;
}
;