Cod sursa(job #623454)

Utilizator florin_marius90Florin Marius Popescu florin_marius90 Data 19 octombrie 2011 22:22:48
Problema Statistici de ordine Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdlib.h>
#include <stdio.h>

int partition(int *v, int f, int n, int k)
{
	
	int i, pivot = f + (n - f)/2 ;
	//v[n] = v[pivot] + v[n] - (v[pivot] = v[n]);
	int aux;
	aux = v[n];
	v[n] = v[pivot];
	v[pivot] = aux;
	pivot = n;

	for (i = f; i < pivot;)
	{
		if (v[i] > v[pivot]) 
		{
			//v[i] = v[pivot] + v[i] - (v[pivot] = v[i]);
			aux = v[i];
			v[i] = v[pivot];
			v[pivot] = aux;
			--pivot;
			//v[i] = v[pivot] + v[i] - (v[pivot] = v[i]);
			aux = v[i];
			v[i] = v[pivot];
			v[pivot] = aux;
		}
		else i++;
	}
	
	return pivot;
}


int main()
{
	int *v, n, k;
	FILE * f = fopen("sdo.in","r");

	fscanf(f, "%i%i", &n, &k);
	k--;
	v = (int *)malloc(n * sizeof(int));
	int i, termen;
	for ( i = 0; i < n; i++)
	{
		fscanf(f, "%i", v + i);	
	}

	int flag = 1,q,left = 0, right = n-1;
	fclose(f);
	while (flag)
	{
		q = partition(v, left,right, k);
		if (q == k)
		{
			termen = v[k]; 
			flag = 0;
		}
		if (q < k)
		  left = q+1;
		if (q > k)
		   right = q-1;
		
	}

	f = fopen ("sdo.out","w");

	fprintf(f, "%i", termen);
	fclose(f);
	return 0;
}