#include <vector>
#include <iostream>
using namespace std;
template <typename Comparable>
void insertionSort(vector<Comparable> & a, int left, int right)
{
if (left == right)
return;
for (int p = left; p <= right; ++p) {
Comparable tmp = std::move(a[p]);
int j;
for (j = p; j > 0 && tmp < a[j - 1]; --j)
a[j] = std::move(a[j - 1]);
a[j] = std::move(tmp);
}
}
template <typename Comparable>
const Comparable & median3(vector<Comparable> & a, int left, int right)
{
int center = (left + right) / 2;
if (a[center] < a[left])
std::swap(a[left], center);
if (a[right] < a[left])
std::swap(a[right], a[left]);
if (a[right] < a[center])
std::swap(a[center], a[right]);
std::swap(a[center], a[right - 1]);
return a[right - 1];
}
template <typename Comparable>
void quickSelect(vector<Comparable> & a, int left, int right, int k)
{
if (left + 10 <= right) {
const Comparable & pivot = median3(a, left, right);
int i = left, j = right - 1;
for (; ;) {
while (a[++i] < pivot) {}
while (a[--j] > pivot) {}
if (i < j)
std::swap(a[i], a[j]);
else
break;
}
std::swap(a[i], a[right - 1]);
if (k <= 1)
quickSelect(a, left, i - 1, k);
else if (k > i + 1)
quickSelect(a, i + 1, right, k);
}
else
insertionSort(a, left, right);
}
int main()
{
int k, x;
vector<int> v;
cin >> k;
for (int i = 0; i < 15; i++) {
cin >> x;
v.push_back(x);
}
quickSelect(v, 0, v.size(), k);
cout << v[k] << endl;
return 0;
}
找出集合中第k个最小元
最新推荐文章于 2021-04-28 20:10:29 发布