Pagini recente » Cod sursa (job #1438586) | Cod sursa (job #51655) | Cod sursa (job #2027288) | Cod sursa (job #3030600) | Cod sursa (job #662816)
Cod sursa(job #662816)
#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)
{
nrLess++;
less[nrLess]=v[i];
}
else
{
nrGreater++;
greater[nrGreater]=v[i];
}
}
for(int i=1;i<=nrLess;i++)
v[i]=less[i];
v[nrLess+1]=valoarePivot;
for(int i=1;i<=nrGreater;i++)
v[i]=greater[i];
return pivot;
}
int nth_element(int v[],int p,int u,int k)
{
int pivot = divide(v,p,u);
if(pivot == k)
return v[pivot];
else if(pivot < k)
return nth_element(v,pivot+1,u,k);
else
return nth_element(v,p,pivot-1,k);
}
int main()
{
freopen("sdo.in","r",stdin);
freopen("sdo.in","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));
return 0;
}