Pagini recente » Cod sursa (job #1054496) | Cod sursa (job #395781) | Cod sursa (job #680285) | Cod sursa (job #536216) | Cod sursa (job #2233584)
#include <fstream>
#include <ctime>
const int MAX = 3e6;
std::ifstream f("sdo.in");
std::ofstream g("sdo.out");
int v[MAX + 5];
int part(int, int);
void selection(int, int, int);
int main() {
int N, K;
f >> N >> K;
for(int i = 1; i <= N; ++i)
f >> v[i];
selection(1, N, K);
g << v[K];
return 0x0;
}
int part(int left, int right) {
int i = left - 1, j = right + 1, pivot = v[left + (rand() % (right - left + 1))];
while(1) {
do {
++i;
} while (v[i] < pivot);
do {
--j;
} while (pivot < v[j]);
if (i < j)
std::swap(v[i], v[j]);
else
return j;
}
return 0;
}
void selection(int left, int right, int k) {
if(left == right)
return;
int indexOfPivot = part(left, right);
int referenceIndex = indexOfPivot - left + 1;
if(referenceIndex >= k)
selection(left, indexOfPivot, k);
else
selection(indexOfPivot + 1, right, k - referenceIndex);
}