Cod sursa(job #1245817)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 20 octombrie 2014 01:00:12
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <stdlib.h>

int v[3000001];

void switch_elem(int i, int j)
{
	int glass = v[i];
	v[i] = v[j];
	v[j] = glass;
}

int partition(int beg, int end)
{
	int pivot = v[end];
	int i = beg - 1;
	int j;
	for (j = beg; j <= end - 1; j++) {
		if (v[j] <= pivot) {
			i = i + 1;
			switch_elem(i, j);
		}
	}
	switch_elem(i + 1, end);
	return i + 1;
}

int randomized_select(int beg, int end, int i) 
{
	if (beg == end) return v[beg];
	int r = rand() % (end - beg) + beg;
	switch_elem(r, end);
	int elem = partition(beg, end);
	int k = elem - beg + 1;
	if (i == k) return v[elem];
	else if (i < k) return randomized_select(beg, elem - 1, i);
	else return randomized_select(elem + 1, end, i - k);
}

int main()
{
	int n, k;
	int i;
	FILE *fdi = fopen("sdo.in", "r");
	fscanf(fdi, "%d%d", &n, &k);
	for (i = 1; i <= n; i++) fscanf(fdi, "%d", &v[i]);
	fclose(fdi);
	srand(time(NULL));
	int q = randomized_select(1, n, k);
	FILE *fdo = fopen("sdo.out", "w");
	fprintf(fdo, "%d\n", q);
	fclose(fdo);
	return 0;
}