Introduction to divide and conquer algorithm · · small number of K

  • Algorithmic descriptions
    for different data size selecting different algorithms for large scale, the first group, such as groups of five, each group forming a median identify a set of data for this set of data, to find the median, Using this median size of this data can be divided into two parts, most are looking to see that number in part, the recursive call.
  • Source
#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());
}
  • Input data
    -
  • operation result
    Here Insert Picture Description
Published 77 original articles · won praise 40 · views 20000 +

Guess you like

Origin blog.csdn.net/y_dd6011/article/details/97429801