Pagini recente » Cod sursa (job #2813182) | Cod sursa (job #2833163) | Cod sursa (job #1549204) | Concurs-mihai-patrascu-2013/clasament | Cod sursa (job #407010)
Cod sursa(job #407010)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int kth_elem(int* & v, short n, short k) {
// pt k == 1, nr cautat este minimul vectorului
if (k == 1) {
int r = v[0];
for (int i = 1; i < n; i++)
if (v[i] < r)
r = v[i];
return r;
}
int p = v[rand() % n]; // alegere pivot aleator
int lt_nr = 0, gt_nr = 0, *lt = NULL, *gt = NULL;
for (int i = 0; i < n; i++)
if (v[i] < p)
lt_nr++;
if (lt_nr < k && lt_nr != 0) {
gt = new int[n - lt_nr];
for (int i = 0; i < n; i++)
if (v[i] >= p)
gt[gt_nr++] = v[i];
free(v);
return kth_elem(gt, gt_nr, k - lt_nr);
}
else {
lt = new int[lt_nr];
lt_nr = 0;
for (int i = 0; i < n; i++)
if (v[i] < p)
lt[lt_nr++] = v[i];
free(v);
return kth_elem(lt, lt_nr, k);
}
}
int main() {
freopen("sdo.in", "r", stdin);
freopen("sdo.out", "w", stdout);
int k, n;
int *v, r, tmp;
scanf("%d %d", &n, &k);
v = new int[n];
for (int i = 0; i < n; i++)
scanf("%d", v++);
v -= n;
printf("%d\n", kth_elem(v, n, k));
return 0;
}