给定n(1≤n≤1000000)个元素,求第k小数(1≤k≤n)。
输入格式:
一组样例。第一行输入两个整数n和k。第二行输入n个不同的int范围内的数。
输出格式:
输出一行,输出第k小数。
样例输入
5 2
1 5 3 2 4
样例输出
2
这是一个典型的线性时间选择问题,代码如下:
#include <iostream>
using namespace std;
int a[1000001];
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
int partition(int a[],int p,int r)
{
int x=a[r];
int middle=p;
int j;
for(j=p;j<r;j++)
{
if(a[j]<x)
{
if(j!=middle)
swap(a[middle],a[j]);
middle++;
}
}
swap(a[middle],a[j]);
return middle;
}
void select(int a[],int p,int r)
{
if(p<r)
{
int q=partition(a,p,r);
select(a,p,q-1);
select(a,q+1,r);
}
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
select(a,0,n-1);
cout<<a[k-1]<<endl;
return 0;
}