Pagini recente » Cod sursa (job #2534991) | Cod sursa (job #2326961) | Cod sursa (job #1363309) | Borderou de evaluare (job #1330600) | Cod sursa (job #1245815)
#include <stdio.h>
#include <stdlib.h>
int v[3000001];
void switch_elem(int i, int j)
{
int glass = v[i];
v[i] = v[j];
v[j] = glass;
}
int partition(int beg, int end)
{
int pivot = v[end];
int i = beg - 1;
int j;
for (j = beg; j <= end - 1; j++) {
if (v[j] <= pivot) {
i = i + 1;
switch_elem(i, j);
}
}
switch_elem(i + 1, end);
return i + 1;
}
int randomized_select(int beg, int end, int i)
{
if (beg == end) return v[beg];
int elem = partition(beg, end);
int k = elem - beg + 1;
if (i == k) return v[elem];
else if (i < k) return randomized_select(beg, elem - 1, i);
else return randomized_select(elem + 1, end, i - k);
}
int main()
{
int n, k;
int i;
scanf("%d%d", &n, &k);
for (i = 1; i <= n; i++) scanf("%d", &v[i]);
int q = randomized_select(1, n, k);
printf("%d\n", q);
return 0;
}