#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