/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:在大量数据中查找最大的若干个数据
*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2012/10/31
*/
/*
*利用快速排序的方法进行查找,首先将整个待查找的数据放入STL中的向量中,然后依据快速排序的方法
递归查找
*/
#include <iostream>
#include <vector>
#include <Iterator>
#include <algorithm>
#include <ctime>
using namespace std;
const int N=100; //有100个数据
template<class Iterator,class Type>
class SelectMaxN {
private:
int n; //选择多少个最大的数据
vector<Type>v; //将这些n个最大的数据保存在此向量中
Iterator Divide(Iterator start,Iterator finish) {
Type temp=*start;
while(start<finish) {
while(*finish>temp && finish>start) finish--;
if(finish>start) *start++=*finish;
while(*start<temp && finish>start) start++;
if(finish>start) *finish--=*start;
}
*start=temp;
return start;
}
void Solution(Iterator start,Iterator finish) {
Iterator mid=Divide(start,finish-1);
if(finish-mid==n) { //此时最大的n个元素已经生成
find(start,finish);
return;
}
else if(finish-mid>n) { //此时[mid,finish-1]区间中的数大于n
Solution(mid+1,finish);
}
else { //此时[mid,finish-1]区间中已经出现了最大的如干个数
int i=0; //用来计算从[mid,finish-1]区间中有多少个数
Iterator it=finish-1;
while(it>=mid) {
v.push_back(*it--);
i++;
}
n-=i; //需要在[start,mid-1]区间中查找n-i个最大的数
Solution(start,mid-1);
}
}
void find(Iterator start,Iterator finish) {
int i;
Iterator it=finish-1;
for(i=0;i<n && it>=start;i++) {
v.push_back(*it--);
}
}
public:
SelectMaxN(Iterator start,Iterator finish,int n) {
if(n>finish-start) this->n=finish-start; //n已经超过所有数据个数
this->n=n;
Solution(start,finish);
}
void show() {
vector<Type>::iterator it;
for(it=v.begin();it!=v.end();it++) {
cout<<*it<<" ";
}
cout<<endl;
}
};
void main() {
srand(unsigned(time(0)));
vector<int>a;
int i;
for(i=0;i<N;i++) { //随机生成N个整数
a.push_back(rand()%N);
cout<<a[i]<<" ";
}
cout<<endl;
SelectMaxN<vector<int>::iterator,int>aa(a.begin(),a.end(),8);
aa.show();
}