[置頂] 大數(一億個數)中求前一百個最大的數輸出問題

#include <iostream>
using namespace std;
#include<ctime>
/*
一億個數裏面求前一百個最大的數輸出問題
算法思想:
一、將前一百個數建成小根堆
二、後面數字依此與肯比較大小
	(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------------------------ios

相關文章
相關標籤/搜索