Cod sursa(job #803450)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 27 octombrie 2012 16:57:19
Problema Statistici de ordine Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <stdlib.h>

int n, k;
int a[3000001];

void schimba(int i, int j)
{	
	int aux = a[i];
	a[i] 	= a[j];
	a[j] 	= aux;
}


int partitioneaza(int stanga, int dreapta)
{
	int i, j, pivot;
	i = stanga - 1;
	j = dreapta + 1;	

	pivot = stanga + (rand() % (dreapta - stanga) + 1);
	schimba(stanga, pivot);
	pivot = a[stanga];

	while (i < j)
	{
		while (a[++i] < pivot)
			if (i >= j)	break;

		while (a[--j] > pivot);

		if (i < j)
			schimba(i, j);
	}
	
	schimba(stanga, j);
	return j;
}


int sdo(int k)
{
	int i  = 	1; 
	int j  =	n;
	int p;

 	while (i < j)
	{
		p = partitioneaza(i, j);
		if 		(k < p)		j = p - 1;
		else if	(k > p)		i = p + 1;
		else				return a[k];				
	}
	return a[k];
}
			
int main(void)
{
	int i;
	FILE * in 	= 	fopen("sdo.in", "r");
	FILE * out 	= 	fopen("sdo.out", "w");

	fscanf(in, "%d %d", &n, &k);
	for (i = 1; i <= n; ++i)
		fscanf(in, "%d", &a[i]);

	printf("%d %d\n", n, k);
	
	i = sdo(k);
	fprintf(out, "%d\n", i);	
	printf("%d\n", i);

	fclose(out);
	fclose(in);
	return 0;
}