64,654
社区成员
发帖
与我相关
我的任务
分享
//这个应该比全部排序要快点
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
#include <time.h>
template <class T>
void find_max(T* datas,size_t ds,list<T>& max,size_t ms)
{
size_t i;
for(i=0;i< ms;++i)
{
max.push_back(datas[i]);
}
max.sort( greater<T>());//降序
for ( i = ms; i < ds; ++i)// 20 19 18 16 15 10 8 7//
{
if(datas[i] < *max.begin())//算法效率的关键在,对小于这ms个数的数直接放弃
continue;
list<T>::iterator iter;
for(iter=max.begin();iter != max.end();++iter)
{
if(datas[i] > *iter)
{
max.insert(iter,datas[i]);
max.pop_back();
break;
}
}
}
}
int main()
{
srand(time(0));//
const int size = 100;
float* datas = new float[size];
int i;
for ( i = 0; i < size; ++i)
{
datas[i] = (float)rand();
//cout<<datas[i]<<' ' ;
}
const int m=10;
float max[m] = {0.0};
//排序后输出最大的m个数,测试对比用.
//sort(&datas[0],&datas[size]);
//for ( i = size-1; i >=size-m; --i)
//{
// cout<<datas[i]<<' ' ;
//}
//cout<<endl;
list<float> fmax;
find_max(datas,size,fmax,m);
for (list<float>::iterator iter=fmax.begin();iter!=fmax.end();++iter)
cout<<*iter<<" ";
cout<<endl;
delete[] datas;
return 0;
}