【深基9.例4】求第 k 小的数
题目描述
输入 nnn(1≤n<50000001 \le n < 50000001≤n<5000000 且 nnn 为奇数)个数字 aia_iai(1≤ai<1091 \le a_i < {10}^91≤ai<109),输出这些数字的第 kkk 小的数。最小的数是第 000 小。
请尽量不要使用 nth_element
来写本题,因为本题的重点在于练习分治算法。
输入格式
输出格式
样例 #1
样例输入 #1
5 1
4 3 2 1 5
样例输出 #1
2
#include<iostream>
using namespace std;
const int N=5000005;
int a[N];
int n,k;
void quick_sort(int l,int r){
if(l>=r){printf("%d\n",a[l]);return;}
int i=l,j=r,x=a[(l+r)/2];
do{
while(a[i]<x)i++;
while(a[j]>x)j--;
if(i<=j){swap(a[i],a[j]);i++,j--;}
}while(i<=j);
if(k<=j)quick_sort(l,j);
else if(i<=k)quick_sort(i,r);
else quick_sort(j+1,i-1);
}
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
quick_sort(0,n-1);
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5000005;
int a[N];
int n,k;
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
nth_element(a,a+k,a+n);
cout<<a[k];
}