Pagini recente » Cod sursa (job #1737843) | Cod sursa (job #552740) | Cod sursa (job #2987730) | Cod sursa (job #272280) | Cod sursa (job #803450)
Cod sursa(job #803450)
#include <stdio.h>
#include <stdlib.h>
int n, k;
int a[3000001];
void schimba(int i, int j)
{
int aux = a[i];
a[i] = a[j];
a[j] = aux;
}
int partitioneaza(int stanga, int dreapta)
{
int i, j, pivot;
i = stanga - 1;
j = dreapta + 1;
pivot = stanga + (rand() % (dreapta - stanga) + 1);
schimba(stanga, pivot);
pivot = a[stanga];
while (i < j)
{
while (a[++i] < pivot)
if (i >= j) break;
while (a[--j] > pivot);
if (i < j)
schimba(i, j);
}
schimba(stanga, j);
return j;
}
int sdo(int k)
{
int i = 1;
int j = n;
int p;
while (i < j)
{
p = partitioneaza(i, j);
if (k < p) j = p - 1;
else if (k > p) i = p + 1;
else return a[k];
}
return a[k];
}
int main(void)
{
int i;
FILE * in = fopen("sdo.in", "r");
FILE * out = fopen("sdo.out", "w");
fscanf(in, "%d %d", &n, &k);
for (i = 1; i <= n; ++i)
fscanf(in, "%d", &a[i]);
printf("%d %d\n", n, k);
i = sdo(k);
fprintf(out, "%d\n", i);
printf("%d\n", i);
fclose(out);
fclose(in);
return 0;
}