Pagini recente » Cod sursa (job #2849498) | Cod sursa (job #2154234) | Cod sursa (job #132367) | Cod sursa (job #2482050) | Cod sursa (job #662828)
Cod sursa(job #662828)
#include <cstdio>
#include <cstdlib>
using namespace std;
const int NMAX = 3000001;
int v[NMAX],less[NMAX],greater[NMAX],nrLess,nrGreater;
int n,k;
int divide(int v[],int p,int u)
{
int pivot = p + rand()%(u-p+1);
int valoarePivot = v[pivot];
nrLess = 0;
nrGreater = 0;
for(int i=p;i<=u;i++)
if(i != pivot)
{
if(v[i]<=valoarePivot)
less[++nrLess]=v[i];
else
greater[++nrGreater]=v[i];
}
int poz = p-1;
for(int i=1;i<=nrLess;i++)
v[++poz]=less[i];
v[++poz]=valoarePivot;
for(int i=1;i<=nrGreater;i++)
v[++poz]=greater[i];
//printf("%d\n",pivot);
return pivot;
}
int nth_element(int v[],int p,int u,int k)
{
int pivot = divide(v,p,u);
if(pivot-p+1 == k)
return v[pivot-p+1];
else if(pivot-p+1 < k)
return nth_element(v,pivot+1,u,k-pivot+p);
else
return nth_element(v,p,pivot-1,k);
}
int main()
{
freopen("sdo.in","r",stdin);
freopen("sdo.out","w",stdout);
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
printf("%d\n",nth_element(v,1,n,k));
//for(int i=1;i<=n;i++)
//printf("%d ",v[i]);
return 0;
}