Pagini recente » Cod sursa (job #3320749) | Cod sursa (job #3321154) | Cod sursa (job #3323869) | Cod sursa (job #3345598) | Cod sursa (job #3352329)
#include <stdio.h>
#include <stdlib.h>
#define N 3000000
int v[N];
void shuffle(int v[], int n);
void swap(int *pa, int *pb);
int partition(int v[], int st, int dr);
int main(void) {
FILE *in = fopen("sdo.in", "r");
int n, k;
fscanf(in, "%d%d", &n, &k);
k--;
for (int i = 0; i < n; i++) {
fscanf(in, "%d", &v[i]);
}
fclose(in);
shuffle(v, n);
int st = 0, dr = n - 1;
while (st <= dr) {
int p = partition(v, st, dr);
if (k < p) {
dr = p - 1;
} else if (k > p) {
st = p + 1;
} else {
dr = st - 1;
}
}
FILE *out = fopen("sdo.out", "w");
fprintf(out, "%d\n", v[k]);
fclose(out);
return 0;
}
void shuffle(int v[], int n) {
for (int i = n - 1; i > 0; i--) {
int j = rand() % (i + 1);
swap(&v[i], &v[j]);
}
}
void swap(int *pa, int *pb) {
int t = *pa;
*pa = *pb;
*pb = t;
}
/*
int partition(int v[], int st, int dr) {
int pivot = v[dr];
int i = st, poz = st;
while (i < dr) {
if (v[i] <= pivot) {
swap(&v[i], &v[poz++]);
}
i++;
}
swap(&v[poz], &v[dr]);
return poz;
}
*/
int partition(int v[], int st, int dr) {
// printf("Trebuie sa partitionam vectorul:\n");
// for (int i = st; i <= dr; i++) {
// printf("%d ", v[i]);
// }
// printf("\n");
int pivot = v[st+(dr-st)/2];
int i = st - 1, j = dr + 1;
while (i < j) {
do {
i++;
} while (v[i] < pivot);
// printf("ne oprim in stanga pe pozitia %d la %d\n", i, v[i]);
do {
j--;
} while (v[j] > pivot);
// printf("ne oprim in dreapta pe pozitia %d la %d\n", j, v[j]);
if (i >= j) {
return j;
}
swap(&v[i], &v[j]);
}
// printf("Pivotul a fost %d\n", pivot);
// for (int i = st; i <= dr; i++) {
// printf("%d ", v[i]);
// }
// printf("\n");
return j;
}