前言
使用快速排序算法思想,查找数组中的第k大的数。复杂度为 O ( n ) O(n) O(n)。
代码
#include <iostream>
#include <vector>
#include <algorithm>
// find median
using namespace std;
int getMedian(vector<int> &vec, int left, int right, int k) {
int i = left;
int j = right;
int x = vec[i];
int min_num = x;
while (i < j) {
while (j > i && vec[j] >= x) {
min_num = min(min_num, vec[j]);
j--;
}
if (i == j) {
break;
} else {
vec[i] = vec[j];
min_num = min(min_num, vec[j]);
i++;
}
while (i < j && vec[i] <= x) {
min_num = min(min_num, vec[i]);
i++;
}
if (i == j) {
break;
} else {
vec[j] = vec[i];
min_num = min(min_num, vec[i]);
j--;
}
}
vec[i] = x;
if (k == 1) {
return min_num;
}
if (i - left + 1 >= k) {
return getMedian(vec, left, i, k);
} else {
return getMedian(vec, i + 1, right, k - (i - left + 1));
}
}
int main() {
srand(rand());
vector<int> vec;
cout << "init:" << endl;
for (int i = 0; i < 3; ++i) {
vec.push_back(rand() % 20);
cout << vec.back() << " ";
}
cout << endl;
int m = (vec.size() + 1) / 2;
cout << "median:" << getMedian(vec, 0, vec.size() - 1, m) << endl;
cout << "sort:" << endl;
sort(vec.begin(), vec.end());
for (auto &it:vec) {
cout << it << " ";
}
return 0;
}