n个元素中找前m个高效率算法

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值