Pagini recente » Cod sursa (job #1418055) | Cod sursa (job #1290443) | Cod sursa (job #1367385) | Cod sursa (job #344858) | Cod sursa (job #1080437)
#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[k];
} 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 + 1];
for(int i = 1; i <= nV; i++) {
in >> Arr[i];
}
out << qsel(Arr, 1, nV, k);
return 0;
}