Pagini recente » Cod sursa (job #257384) | Cod sursa (job #2461248) | Cod sursa (job #2622555) | Cod sursa (job #493435) | Cod sursa (job #995266)
Cod sursa(job #995266)
#include <fstream>
#include <utility>
#include <cstdlib>
#include <ctime>
int parts(int *A, int left, int right, int k);
int qselect(int *A, int left, int right, int k);
int main()
{
srand(time(0));
std::ifstream in("sdo.in");
std::ofstream out("sdo.out");
int nV, *nA, k;
in >> nV;
nA = new int[nV];
for(int i = 0; i < nV; i++)
in >> nA[i];
in >> k;
out << qselect(nA, 0, nV - 1, k);
return 0;
}
int parts(int *A, int left, int right, int k)
{
int pivot = A[k], index = left;
std::swap(A[k], A[right]);
for(int i = left; i < right; i++)
if(pivot > A[i])
{
std::swap(A[i], A[index]);
index++;
}
std::swap(A[right], A[index]);
return index;
}
int qselect(int *A, int left, int right, int k)
{
if(left == right) return A[left];
int pi = left + rand() % (right - left);
int npi = parts(A, left, right, pi);
int dist = npi - left + 1;
if(dist == k) return A[npi];
else if(k < dist) return qselect(A, left, npi - 1, k);
else return qselect(A, npi + 1, right, k - dist);
}