- 算法说明
对于不同的数据规模选择不同的算法,对于大规模,先进行分组,如5个一组,找出每组的中位数形成一组数据,对于这组数据,再找其中位数,利用这个中位数就可将这个数据规模分成两部分,最看要找的数在那一部分中,递归调用。 - 源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int findKthSmallestElement(vector<int> vt, int k);
int main() {
freopen("findKthSmallestElementInput.txt", "r", stdin);
int n, k;
vector<int> vt;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &k);
vt.push_back(k);
}
scanf("%d", &k);
int ans = findKthSmallestElement(vt, k);
freopen("findKthSmallestElementOutput.txt", "w", stdout);
printf("第%d小的数据元素为:%d", k, ans);
}
int findKthSmallestElement(vector<int> vt, int k) {
int size = vt.size();
if(size < 75) {
sort(vt.begin(), vt.end());
return vt[k - 1];
}
vector<int> medium;
int numEle = 5;
for(int i = 0; i < size; i += numEle) {
vector<int> temp;
for(int j = i; j < i + numEle && j < size; j++) {
temp.push_back(vt[j]);
}
if(temp.size()) medium.push_back(findKthSmallestElement(temp, 1 + temp.size()/2));
}
int x = findKthSmallestElement(medium, 1 + medium.size()/2);
vector<int> S1, S2;
for(int i = 0; i < size; i++){
if(vt[i] <= x) S1.push_back(vt[i]);
else S2.push_back(vt[i]);
}
if(k <= S1.size()) return findKthSmallestElement(S1, k);
else return findKthSmallestElement(S2, k-S1.size());
}
- 输入数据
- 运行结果