Pagini recente » Cod sursa (job #3139903) | Cod sursa (job #2776639) | Cod sursa (job #1945357) | Cod sursa (job #3005000) | Cod sursa (job #526478)
Cod sursa(job #526478)
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
#define NMAX 3000000
int vect[NMAX];
void interschimbare(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int partition(int p, int r)
{
int pivot = vect[p];
int i = p;
for (int j=i+1;j<=r;j++)
{
if (vect[j] <= pivot)
{
i++;
interschimbare(&vect[i],&vect[j]);
}
}
interschimbare(&vect[p],&vect[i]);
return i;
}
int partition_rand(int p, int r)
{
int rand_pos = p+(rand()%(r-p+1));
interschimbare(&vect[p],&vect[rand_pos]);
return partition(p,r);
}
int order_statistic(int p, int r, int searchKey)
{
if (p==r)
{
return vect[p];
}
int q = partition_rand(p,r);
int k = q-p+1;
if (k == searchKey)
{
return vect[q];
}
else if (k > searchKey)
{
return order_statistic(p,q-1,searchKey);
}
else return order_statistic(q+1,r,searchKey-k);
}
int main(void)
{
int n, searchKey;
srand((unsigned int)time(0));
freopen("sdo.in","r",stdin);
scanf("%d %d",&n, &searchKey);
for (int i=0;i<n;i++)
scanf("%d",&vect[i]);
freopen("sdo.out","w",stdout);
printf("%d\n",order_statistic(0,n-1,searchKey));
return 0;
}