Cod sursa(job #2423101)

Utilizator puzzleFlutur Vasile puzzle Data 20 mai 2019 19:11:57
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <time.h>

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

#define Nmax 3000000

unsigned nums[Nmax];

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

int partition_r(int start, int end)
{
	srand(time(NULL));
	int n = end - start + 1;

	int pivot = rand() % n;

	std::swap(nums[start + pivot], nums[end]);
	return partition(start, end);
}

unsigned QuickSelect(int start, int end,int k)
{
	if (k > 0 && k <= end - start + 1)
	{
		int index = partition_r(start, end);

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

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

int main()
{
	int n, k;

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

	

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

	return 0;
}