Mai intai trebuie sa te autentifici.
Cod sursa(job #766091)
Utilizator | Data | 10 iulie 2012 12:05:44 | |
---|---|---|---|
Problema | Statistici de ordine | Scor | 100 |
Compilator | c | Status | done |
Runda | Arhiva educationala | Marime | 0.96 kb |
/*
Statistici de ordine.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXN 3000000
int n, k;
int vector[MAXN];
void interschimb (int *a, int *b) {
int aux;
aux = *a;
*a = *b;
*b = aux;
}
int partitie (int st, int dr) {
int i = st - 1;
int j = dr + 1;
int p = vector[st + rand() % (dr - st + 1)];
while (1) {
while (vector[++i] < p)
;
while (vector[--j] > p)
;
if (i < j)
interschimb(&vector[i], &vector[j]);
else
return j;
}
return 0;
}
void gaseste_element (int st, int dr, int k) {
if (st >= dr)
return;
int pivot = partitie(st, dr);
int i = pivot - st + 1;
if (i >= k)
gaseste_element(st, pivot, k);
else
gaseste_element(pivot + 1, dr, k - i);
}
int main () {
freopen("sdo.in", "r", stdin);
freopen("sdo.out", "w", stdout);
int i;
scanf("%d %d", &n, &k);
for (i = 1; i <= n; i++)
scanf("%d", &vector[i]);
srand(time(NULL));
gaseste_element(1, n, k);
printf("%d\n", vector[k]);
return 0;
}