Cod sursa(job #995267)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 8 septembrie 2013 15:00:03
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <utility>
#include <cstdlib>
#include <ctime>

int parts(int *A, int left, int right, int k);
int qselect(int *A, int left, int right, int k);

int main()
{
	srand(time(0));
	std::ifstream in("sdo.in");
	std::ofstream out("sdo.out");
	int nV, *nA, k;
	in >> nV >> k;
	nA = new int[nV];
	for(int i = 0; i < nV; i++)
		in >> nA[i];
	out << qselect(nA, 0, nV - 1, k);
	return 0;
}

int parts(int *A, int left, int right, int k)
{
	int pivot = A[k], index = left;
	std::swap(A[k], A[right]);
	for(int i = left; i < right; i++)
		if(pivot > A[i])
		{
			std::swap(A[i], A[index]);
			index++;
		}
	std::swap(A[right], A[index]);
	return index;
}

int qselect(int *A, int left, int right, int k)
{
	if(left == right) return A[left];
	int pi = left + rand() % (right - left);
	int npi = parts(A, left, right, pi);
	int dist = npi - left + 1;
	if(dist == k) return A[npi];
	else if(k < dist) return qselect(A, left, npi - 1, k);
	else return qselect(A, npi + 1, right, k - dist);
}