Pagini recente » Cod sursa (job #892882) | Cod sursa (job #2287563) | Cod sursa (job #1621014) | Cod sursa (job #3139742) | Cod sursa (job #1080442)
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <utility>
int parts(int *Arr, int left, int right, int pi) {
int index = left;
std::swap(Arr[pi], Arr[right]);
for(int i = left; i < right; i++) {
if(Arr[right] > Arr[i]) {
std::swap(Arr[index], Arr[i]);
index++;
}
}
std::swap(Arr[index], Arr[right]);
return index;
}
int qsel(int *Arr, int left, int right, int k) {
if(right == left) {
return Arr[left];
}
int pi = left + rand() % (right - left);
int npi = parts(Arr, left, right, pi);
int dist = npi - left + 1;
if(dist == k) {
return Arr[npi];
} else if(k < dist) {
return qsel(Arr, left, npi - 1, k);
} else {
return qsel(Arr, npi + 1, right, k - dist);
}
}
int main() {
srand(time(NULL));
std::ifstream in("sdo.in");
std::ofstream out("sdo.out");
int nV, k;
in >> nV >> k;
int *Arr = new int[nV];
for(int i = 0; i < nV; i++) {
in >> Arr[i];
}
out << qsel(Arr, 0, nV - 1, k);
return 0;
}