[置顶] 大数(一亿个数)中求前一百个最大的数输出问题

#include <iostream>
using namespace std;
#include<ctime>
/*
一亿个数里面求前一百个最大的数输出问题
算法思想:
1、将前一百个数建成小根堆
2、后面数字依此与肯比较大小
	(1)如果比根大进行下一个
	(2)如果比根小,将其与根替换并调整堆重新为小根堆
*/
void BuildMinHeap(int A[],int len);
void AdjustDown(int A[],int k,int len);
int main()
{
	//因为A为堆所以A[0]不用
	int A[101];int count=100;

	while(count--)//前一百个数默认为最大数
	{
		A[count+1]= rand()%1000+1;
		cout<<A[count+1]<<endl;
	}
	BuildMinHeap(A,100);
	int temp=0;
	time_t start,end,time;//获取程序运行时间

	start = clock();

	for(int i=101;i<100000000;i++)
	{
		temp = rand()%10000;
		if(temp < A[1])//如果下一个数小于小顶堆堆顶元素
		{
			A[1] = temp; //替换
			BuildMinHeap(A,100);//调整堆
		}
	}
	end = clock();

	time = end-start;//单位毫秒
	cout<<"运行时间为"<<time<<endl;
	system("pause");
}

//调整为小根堆
void BuildMinHeap(int A[],int len)
{
	for(int i=len/2;i>0;i--)
	{
		AdjustDown(A,i,len);
	}
}
void AdjustDown(int A[],int k,int len)
{
	//将第K个元素向下调整
	A[0] = A[k];//暂存需要调整的元素
	for(int i = 2*k;i<= len ; i*=2)
	{
		if(i<len && A[i]>A[i+1]) //取其较小的子孙节点
			i++;
		if(A[0]<=A[i]) break;     //如果该节点比子孙节点要小,则不需替换 
		else{//否则
			A[k]= A[i];                 //将A[i]调整到双亲节点上
			k=i;							//k位置为替换的元素,下次循环考虑是否要向下调整
		}
	}
	A[k] = A[0];						//被筛选节点放入最终位置
}


 

 

------------------------VS2010 格式调整 Ctrl k ,Ctrl f------------------------

 

posted on 2014-01-07 16:32  我的小人生  阅读(509)  评论(1编辑  收藏  举报