Cod sursa(job #1245815)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 20 octombrie 2014 00:49:36
Problema Statistici de ordine Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.81 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 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;
	scanf("%d%d", &n, &k);
	for (i = 1; i <= n; i++) scanf("%d", &v[i]);
	int q = randomized_select(1, n, k);
	printf("%d\n", q);
	return 0;
}