Cod sursa(job #766091)

Utilizator ioana26Ioana Andronescu ioana26 Data 10 iulie 2012 12:05:44
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
/*
Statistici de ordine.
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAXN	3000000

int n, k;
int vector[MAXN];

void interschimb (int *a, int *b) {
	int aux;
	aux = *a;
	*a = *b;
	*b = aux;
}

int partitie (int st, int dr) {
	int i = st - 1;
	int j = dr + 1;
	int p = vector[st + rand() % (dr - st + 1)];
	
	while (1) {
		while (vector[++i] < p) 
			;
		while (vector[--j] > p)
			;
		if (i < j)
			interschimb(&vector[i], &vector[j]);
		else 
			return j;
	}
	return 0;
}

void gaseste_element (int st, int dr, int k) {
	if (st >= dr)
		return;

	int pivot = partitie(st, dr);
	int i = pivot - st + 1; 

	if (i >= k)
		gaseste_element(st, pivot, k);
	else
		gaseste_element(pivot + 1, dr, k - i);
}

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

	int i;
	scanf("%d %d", &n, &k);
	for (i = 1; i <= n; i++)
		scanf("%d", &vector[i]);
	
	srand(time(NULL));
	gaseste_element(1, n, k);			
	printf("%d\n", vector[k]);

	return 0;
}