//本算法的思想是把n个元素分为sqrt(n)组,每次从n组中找出最小的。当n>>m时,效率在O(n)级别。
#include<iostream>
#include<algorithm>
#include<time.h>
using namespace std;
template<class E>
void FindMin(E *&arr,int left,int right)
{
E temp=arr[left];
int index=left;
for(int i=left+1;i<=right;i++)
{
if(arr[i]<temp)
{
temp=arr[i];
index=i;
}
}
arr[index]=arr[right];
arr[right]=temp;
}
template<class E>
void Find(E *&arr,int n,int m)
{
int divide=sqrt(double (n)); //ÿ×éÔªËØžöÊý
int divide_num=(n+divide-1)/divide; //·Ö³ÉÈôžÉ×é
int *rem=new int [divide_num]; //ŒÇŒÿ×éÔªËصĞöÊý ÒÑŸÊä³ö¹ýµÄŽÓÖÐÉŸ³ý
int i;
for(i=0;i<divide_num-1;i++)
{
rem[i]=(i+1)*divide-1;
FindMin(arr,rem[i]+1-divide,rem[i]);
}
rem[i]=n-1;
FindMin(arr,i*divide-1,rem[i]);
while(m--)
{
E temp=arr[rem[0]];
int index=0;
for(i=1;i<divide_num;i++)
{
if(rem[i]<i*divide)continue; //ŽË×éÔªËØÒÑŸÈ«²¿Êä³öÁË
if(arr[rem[i]]<temp)
{
temp=arr[rem[i]];
index=i;
}
}
cout<<temp<<endl;
rem[index]--;
FindMin(arr,index*divide,rem[index]); //ÖØе÷Õû
}
}
int main()
{
srand(time(0));
int n=99;
int *arr=new int[n];
for(int i=0;i<100;i++)
{
arr[i]=rand()%1000;
}
Find(arr,100,6);
sort(arr,arr+100);
for(int i=0;i<100;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
n个元素中找前m个高效率算法
最新推荐文章于 2019-11-12 15:57:27 发布