您的位置:首页 > 其它

二.用最小堆方法找出海量数据中最小的k个数

2015-06-26 12:21 295 查看
思路:用数组b模拟海量数据的数组,数组a存放最小的k个数,首先将数组b的前k个数赋值给a,对a建最大堆,则此时a[0]存放a的最大元素,然后遍历b中k

以后的数据和a[0]比较,如果比a[0]小,则赋值给a[0],并且对a进行重新的调整是a[0]仍然最大,这样知道把b遍历完为止。

调整堆用时logk,遍历b用时n,时间复杂度nlogb

#include<iostream>
using namespace std;

void adjustHeap(int a[],int s,int n)
{
	int temp=a[s];
	for(int i=2*s+1;i<=n;i=i*2+1)
	{
		if((i+1)<=n&&a[i]<a[i+1])
			i++;
		if(temp>a[i])
			break;
		a[s]=a[i];
		s=i;
	}
	a[s]=temp;
}

void heap_buid(int a[],int n)
{
	for(int i=n/2-1;i>=0;i--)
	{
		adjustHeap(a,i,n-1);
	}

	/*for(int i=n-1;i>=1;i--)
	{
		swap(a[0],a[i]);
		adjustHeap(a,0,i-1);

	}*/
}
void main()
{

	int k;
	int b[]={7,3,9,0,1,2,5,10,100,-1,-2};
	int n=sizeof(b)/sizeof(int);
	cout<<"b:";
	for(int i=0;i<n;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	
	cout<<"请输入要找出最小的多少位数"<<endl;
	cin>>k;
	int *a=(int*)malloc(sizeof(int)*k);

	for(int i=0;i<k;i++)
	{
		a[i]=b[i];
	}

	heap_buid(a,k);
	cout<<"a1:";
	for(int i=0;i<k;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	for(int i=k;i<n;i++)
	{
		if(a[0]>b[i])
		{
			a[0]=b[i];
			adjustHeap(a,0,k-1);
		}
			
	}
	cout<<"a2:";
	for(int i=0;i<k;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	system("pause");

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: