Cod sursa(job #2270909)

Utilizator felipeGFilipGherman felipeG Data 27 octombrie 2018 18:58:16
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <climits>
#include <algorithm>
#define NMAX 10001

using namespace std;

int partition(int v[], int low, int high)
{
	int pivot = v[high];
	int i = low - 1;

	for (int j = low; j < high; j++)
	{
		if (v[j] <= pivot)
		{
			i++;
			swap(v[i], v[j]);
		}
	}
	swap(v[i + 1], v[high]);
	return i+1;
}

int randomizedPartition(int v[], int low, int high)
{
	int i = (rand() % (high - low + 1)) + low;
	swap(v[ high ], v[ i ]);
	return partition(v, low, high);
}


int quickSelect(int v[], int low, int high, int k)
{
	if (k > 0 && k <= high - low + 1)
	{
		int index = randomizedPartition(v, low, high);

		if (index - low == k - 1)
			return v[index];

		if (index - low > k - 1)
			return quickSelect(v, low, index - 1, k);

		return  quickSelect(v, index + 1, high,k - index + low - 1);
	}

	return INT_MAX;
}

int main()
{
	int v[3000001];
	ifstream f ("sdo.in");
	ofstream g ("sdo.out");

	int n, k;

	f >> n >> k;

	for ( int i = 1; i <= n; ++ i )
        f >> v[ i ];

    g << quickSelect( v, 1, n, k );

	return 0;
}