Cod sursa(job #1868343)

Utilizator M.AnaAna Marginean M.Ana Data 4 februarie 2017 20:42:55
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

ifstream in ("sdo.in");
ofstream out("sdo.out");
int n, k;
int v[3000001];

int partition(int v[], int left, int right) {
	int i = left - 1 , j = right + 1;

	int random = left + (rand() % (right - left + 1));
	int pivot = v[random];

	while (1)
	{
		do
		{
			++i;
		}
		while (v[i] < pivot);

		do
		{
			--j;
		}
		while (pivot < v[j]);

		if (i < j)
			swap(v[i], v[j]);
		else
			return i;
	}

	return 0;
}

void quicksort(int v[], int left, int right, int k) {
	if (left == right) return;

	int index = partition(v, left, right);
	int t = index - left + 1;

	if (t >= k)
		quicksort(v, left, index, k);
	else
		quicksort(v, index + 1, right, k - t);

}
int main()
{
	srand(time(NULL));

	in >> n >> k;

	for (int i = 1; i <= n; i++) {
		in >> v[i];
	}

	quicksort(v, 1, n, k);

	out << v[k];
}