Cod sursa(job #2422132)

Utilizator puzzleFlutur Vasile puzzle Data 17 mai 2019 14:32:28
Problema Statistici de ordine Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

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

const int Nmax = 3000000;

int partition(unsigned int nums[], int start, int end)
{
	unsigned int x = nums[end];
	int i = start;
	for (int j = start; j <= end - 1; j++) {
		if (nums[j] <= x) 
		{
			std::swap(nums[i], nums[j]);
			i++;
		}
	}
	std::swap(nums[i], nums[end]);
	return i;
}

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

		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;
}