Pagini recente » Cod sursa (job #400683) | Cod sursa (job #2708653) | Cod sursa (job #736164) | Cod sursa (job #2937506) | Cod sursa (job #2423101)
#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;
}