【深基9.例4】求第 k 小的数
题目描述
输入 n n n( 1 ≤ n < 5000000 1 \le n < 5000000 1≤n<5000000 且 n n n 为奇数)个数字 a i a_i ai( 1 ≤ a i < 10 9 1 \le a_i < {10}^9 1≤ai<109),输出这些数字的第 k k k 小的数。最小的数是第 0 0 0 小。
请尽量不要使用 nth_element
来写本题,因为本题的重点在于练习分治算法。
输入格式
输出格式
样例 #1
样例输入 #1
5 1
4 3 2 1 5
样例输出 #1
2
注意点
1.快排、找第k小数代码类似
找第k小数就是先快排一次,再分区间去找
2.下面的代码第k小数是从0开始
#include<iostream>
using namespace std;
const int N = 5000010;
int a[N];
int n,k;
int quick_sort(int l,int r,int k)
{
if(l >= r) return a[k];
int x = a[l + r >> 1],i = l - 1,j = r + 1;
while(i < j)
{
do i ++; while(a[i] < x);
do j --; while(a[j] > x);
if(i < j) swap(a[i],a[j]);
}
if(k <= j) return quick_sort(l,j,k);
else return quick_sort(j + 1,r,k);
}
int main()
{
scanf("%d %d",&n,&k);
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
int ans = quick_sort(0,n - 1,k);
printf("%d",ans);
return 0;
}
//快排,y总的模板
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r); //左右递归