Pagini recente » Cod sursa (job #3290020) | Cod sursa (job #2717948) | Cod sursa (job #2954385) | Cod sursa (job #508463) | Cod sursa (job #2423104)
#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)
{
unsigned pivot = nums[start];
while (start < end)
{
if (nums[start] > nums[end])
{
std::swap(nums[start], nums[end]);
}
if (pivot == nums[start])
end--;
else
start++;
}
return start;
}
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[start]);
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;
}