方法一:先对数组进行排序,再得到第k的数,时间复杂度为n*logn
方法二:将数组存在map中,再求中位数,因为map内部是红黑树,时间复杂度应该也是n*logn
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
int main() {
map<int, int> myMap;
int n,k;
cin >> n>>k;
vector<int> myVector(n);
for (int i = 0; i < n; i++) {
cin >> myVector[i];
myMap[myVector[i]]++;
}
int sum=0;
for (auto iter = myMap.begin(); iter != myMap.end(); iter++) {
sum += (*iter).second;
if (sum >= k) {
cout << (*iter).first;
break;
}
}
int t;
cin >> t;
return 0;
}
方法3:结合快速排序,每一次求出一个元素位置,直到找到第k个元素。时间复杂度介于O(n)~O(n*logn)之间,可以认为是O(n)
//寻找第k大的数
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
//使用快速排序,时间复杂度介于n到n*logn之间,可以认为时间复杂度为n
int n, k;
int myArray[100];
int DFSfork(int l, int r, int k) {
int low = l;
int high = r;
int index = l;
int order = -1;
while (l < r) {
if (order == -1) {
if (myArray[r] >= myArray[index]) {
r--;
}
else {
int t = myArray[index];
myArray[index] = myArray[r];
myArray[r] = t;
index = r;
l++;
order = 1;
}
}
else if (order == 1) {
if (myArray[l] <= myArray[index]) {
l++;
}
else {
int t = myArray[index];
myArray[index] = myArray[l];
myArray[l] = t;
index = l;
r--;
order = -1;
}
}
}
if (index == (k - 1)) {
return myArray[index];
}
else if (index > (k - 1)) {
return DFSfork(low, index - 1, k);
}
else {
return DFSfork(index+1, high, k);
}
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> myArray[i];
}
int tt = DFSfork(0, n - 1, k);
cout << tt;
return 0;
}