Cod sursa(job #818772)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 17 noiembrie 2012 23:12:07
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#define TRUE 1


int n, k;
int M[300000020];


void swap(int i, int j)
{
	int aux = M[i];
	M[i] = M[j];
	M[j] = aux;
}


int partition(int left, int right)
{
	int i = left - 1, j = right + 1;
	int mid 	= left + (right - left) / 2;
	int mid_el 	= M[mid];

	swap(mid, left);
	++i;

	while (TRUE)
	{
		while (M[++i] <= mid_el)
			if (i >= j) break;

		while (M[--j] > mid_el) ;
			
		if (i < j)	
		{
			swap(i, j);
		}
		else 		
		{
			swap(left, j);
			return j;		
		}
	}
}


int select(int k, int left, int right)
{
	int i = partition(left, right);
		
	if (k < i)	return select(k, left, i - 1);
	if (k > i) 	return select(k, i + 1, right);
				return M[i];
}


int main(void)
{	
	int i;
	freopen("sdo.in", "r", stdin);
	freopen("sdo.out", "w", stdout);

	
	scanf("%d %d", &n, &k);
	for (i = 0; i < n; ++i)
		scanf("%d", &M[i]);

	printf("%d\n", select(k-1, 0, n-1));

	return 0;
}