Cod sursa(job #2422133)

Utilizator puzzleFlutur Vasile puzzle Data 17 mai 2019 14:33:55
Problema Statistici de ordine Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>

std::ifstream in("sdo.in");
std::ofstream out("sdo.out");

const int Nmax = 3000000;

int partition(int start, int end, unsigned int nums[])
{
	unsigned int piv = nums[start], aux;

	while (start < end)
	{
		if (nums[start] > nums[end])
		{
			aux = nums[start];
			nums[start] = nums[end];
			nums[end] = aux;
		}
		if (piv == nums[start])
			end--;
		else
			start++;
	}
	return start;
}

unsigned int QuickSelect(int start, int end, unsigned int nums[], int k)
{
	if (start < end)
	{
		int index = partition(start, end, nums);

		if (index - start == k - 1)
			return nums[index];

		if (index - start > k - 1)
			return QuickSelect(start, index - 1, nums, k);
		else
			return QuickSelect(index + 1, end, nums, k - (index - start + 1));
	}
}

int main()
{
	int n, k;
	unsigned int nums[Nmax];

	in >> n >> k;
	for (int i = 0; i < n; i++)
		in >> nums[i];

	out << QuickSelect(0, n - 1, nums, k);

	return 0;
}