当前位置:   article > 正文

算法导论 · 分治法 · 第K小的数_算法导论 查找第k小的数

算法导论 查找第k小的数
  • 算法说明
    对于不同的数据规模选择不同的算法,对于大规模,先进行分组,如5个一组,找出每组的中位数形成一组数据,对于这组数据,再找其中位数,利用这个中位数就可将这个数据规模分成两部分,最看要找的数在那一部分中,递归调用。
  • 源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int findKthSmallestElement(vector<int> vt, int k);

int main() {
	//input
	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);
	
	//process 
	int ans = findKthSmallestElement(vt, k);
	
	//output
	freopen("findKthSmallestElementOutput.txt", "w", stdout);
	printf("第%d小的数据元素为:%d", k, ans); 
}
int findKthSmallestElement(vector<int> vt, int k) {
    int size = vt.size();
    if(size < 75) {
    	//数据规模小于75,直接快排找第K小的值 
        sort(vt.begin(), vt.end());
        return vt[k - 1];
    }   
    vector<int> medium; //中间值数据 
    int numEle = 5; //每组numEle个数据 
    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());
}
  • 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
  • 输入数据
    -
  • 运行结果
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/574949
推荐阅读
相关标签
  

闽ICP备14008679号