二.用最小堆方法找出海量數據中最小的k個數

思路:用數組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");

}


發佈了54 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章