P1923 【深基9.例4】求第 k 小的数
题目描述
输入 $n$($1 \le n < 5000000$ 且 $n$ 为奇数)个数字 $a_i$($1 \le a_i < {10}^9$),输出这些数字的第 $k$ 小的数。最小的数是第 $0$ 小。
请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。
输入格式
无
输出格式
无
输入输出样例 #1
输入 #1
5 1
4 3 2 1 5
输出 #1
2
i先动,会遗留一个大于等于基准值的
j先动,会遗留个小于等于基准值的
所以如果最后要和左边的基准值交换,则要j先动
否则i先动
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
int n, k; // n 个数,查找第 k 小的数
int q[5000005];
// 快速选择算法
int quick_select(int l, int r) {
if (l >= r) return q[l]; // 如果只有一个元素,直接返回
// 分区
int i = l, j = r;
while (i < j) {
while (i < j && q[j] >= q[l]) j--;
while (i < j && q[i] <= q[l]) i++;
swap(q[i], q[j]);
}
swap(q[i], q[l]);
// 判断 k 在哪个区间
if (k == i) return q[i];
if (k < i) return quick_select(l, i-1);
return quick_select(i + 1, r);
}
int main() {
cin >> n >> k;
for(int i=0;i<n;i++)
scanf("%d",q+i);
printf("%d",quick_select(0, n - 1));
return 0;
}

浙公网安备 33010602011771号