Pagini recente » Cod sursa (job #2095115) | Cod sursa (job #131572) | Cod sursa (job #2835950) | Cod sursa (job #121298) | Cod sursa (job #2278419)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int arr[3000001];
void swp(int * a, int * b)
{
int aux = *a;
*a = *b;
*b = aux;
}
int mid(int left, int right)
{
int r1 = rand() % (right - left + 1) + left;
int r2 = rand() % (right - left + 1) + left;
int r3 = rand() % (right - left + 1) + left;
if(arr[r1] <= arr[r2] && arr[r1] <= arr[r3])
return ( (arr[r2] < arr[r3]) ? r2:r3);
if(arr[r2] <= arr[1] && arr[r2] <= arr[r3])
return ( (arr[r3] < arr[r1]) ? r3:r1);
if(arr[r3] <= arr[r2] && arr[r3] <= arr[r1])
return ( (arr[2] < arr[1]) ? r2:r1);
}
int partition(int left, int right)
{
int s = mid(left, right);
swp(&arr[s], &arr[right]);
int pivot = arr[right];
int i = left;
for (int j = left; j < right; j++){
if(arr[j] < pivot){
if (i != j){
swp(&arr[i], &arr[j]);
}
i++;
}
}
swp(&arr[right], &arr[i]);
return i;
}
int kel(int left, int right, int k)
{
int p = partition(left, right);
if (p == k) return arr[k];
if (p < k) kel(p + 1, right, k);
else kel(left, p - 1, k);
}
int main()
{
FILE *f, *g;
f = fopen("sdo.in", "r");
g = fopen("sdo.out", "w");
srand( time(NULL));
int n, k;
fscanf(f,"%d%d", &n, &k);
for (int i = 1; i <= n; i++) fscanf(f, "%d", &arr[i]);
int x = kel(1, n, k);
fprintf(g,"%d",x);
return 0;
}