-
Notifications
You must be signed in to change notification settings - Fork 0
/
selection.cc
106 lines (84 loc) · 1.76 KB
/
selection.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <vector>
#include <limits>
int select_kth(std::vector<int> values, unsigned k)
{
if (k == 0 || k > values.size()) {
return std::numeric_limits<int>::min();
}
for (unsigned i = 0; i < k; ++i) {
unsigned minIdx = i;
auto minValue = values[minIdx];
for (unsigned j = i+1; j < values.size(); ++j) {
auto currValue = values[j];
if (currValue < minValue) {
minValue = currValue;
minIdx = j;
}
}
if (minIdx != i) {
using namespace std;
swap(values[minIdx], values[i]);
}
}
return values[k-1];
}
template<typename Iterator>
Iterator partition(Iterator left, Iterator right, Iterator pivot)
{
if (left >= right) return pivot;
using namespace std;
swap(*pivot, *right);
Iterator cand = left;
while (left < right) {
if (*left < *right) {
swap(*cand, *left);
++cand;
}
++left;
}
swap(*cand, *right);
return cand;
}
template<typename Iterator>
Iterator select_pivot(Iterator left, Iterator right)
{
return right;
}
template<typename Iterator>
Iterator select_nth(Iterator left, Iterator right, unsigned n)
{
while (left < right) {
Iterator pivot = select_pivot(left, right);
pivot = partition(left, right, pivot);
std::ptrdiff_t dist = pivot - left + 1;
if (dist == n) {
return pivot;
}
if (dist < n) {
//return select_nth(pivot + 1, right, n - dist);
left = pivot + 1;
n = n - dist;
} else {
right = pivot - 1;
}
}
return left;
}
int main()
{
int n;
std::cin >> n;
std::vector<int> values;
values.reserve(n);
for (unsigned i = 0; i < n; ++i) {
int v;
std::cin >> v;
values.push_back(v);
}
int k;
std::cin >> k;
auto iter = select_nth(values.begin(), values.begin()+values.size()-1, k);
std::cout << k << "th=" << *iter << std::endl;
return 0;
}