//本算法的思想是把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; }