Pagini recente » Cod sursa (job #1118051) | Cod sursa (job #2459931) | Cod sursa (job #3237883) | Cod sursa (job #1353288) | Cod sursa (job #2522450)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;
ifstream in("sdo.in");
ofstream out("sdo.out");
int partition(vector <int> &m, int l, int r) {
int pivot = l + rand() % (r - l + 1);
swap(m[pivot], m[r]);
int st = l, dr = r - 1;
while (true) {
while (m[st] < m[r])
st++;
while (m[dr] > m[r])
dr--;
if (st < dr) {
swap(m[st], m[dr]);
st++;
dr--;
}
else
return st;
}
}
int quickselect(vector <int> &m, int k, int l, int r) {
if (l == r)
return m[l];
int p = partition(m, l, r);
swap(m[p], m[r]);
if (p + 1 == k) {
return m[p];
}
if (k < p + 1) {
return quickselect(m, k, l, p - 1);
}
return quickselect(m, k, p + 1, r);
}
int main() {
int n, k;
in >> n >> k;
vector <int> m(n);
for (int i = 0; i < n; i++) {
in >> m[i];
}
srand(time(NULL));
out << quickselect(m, k, 0, n - 1) << '\n';
return 0;
}