版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yonggie/article/details/89401210
关于详细的堆方法,请参考:
方法一,可以用快速建堆的方法,先让每个元素都待在原来位置,然后从surSize/2处向前getDown()。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=1e3+100;
int curSize=0;
int HeapTree[maxn];
void getDown(int index){
int temp=HeapTree[index];
while(index*2<=curSize){
int child=index*2;
if(child!=curSize&&HeapTree[child]>HeapTree[child+1])child++;
if(temp<=HeapTree[child]) break;
else HeapTree[index]=HeapTree[child];
index=child;
}
HeapTree[index]=temp;
return;
}
void ShowPath(int index){
while(index/2>=1){
cout<<HeapTree[index]<<" ";
index/=2;
}
cout<<HeapTree[index]<<endl;
return;
}
int main(){
int question=0;
while(cin>>curSize>>question){
memset(HeapTree,0,sizeof(0));
HeapTree[0]=-0x3f3f3f3f;
for(int i=1;i<=curSize;i++) cin>>HeapTree[i];
for(int i=curSize/2;i>=1;i--)
getDown(i);
for(int i=1;i<=curSize;i++) cout<<HeapTree[i]<<" ";
cout<<endl;
int t=1;
for(int i=0;i<question;i++){
cin>>t;
ShowPath(t);
}
}
}
方法二:
用堆的本身操作,每次输入一个值,就insert进去。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=1e3+100;
int curSize=0;
int HeapTree[maxn];
//原来不是用快速建堆的那个方法……
void getDown(int index){
int temp=HeapTree[index];
while(index*2<=curSize){
int child=index*2;
if(child!=curSize&&HeapTree[child]>HeapTree[child+1])child++;
if(temp<=HeapTree[child]) break;
else HeapTree[index]=HeapTree[child];
index=child;
}
HeapTree[index]=temp;
return;
}
void Insert(int value){
int i=curSize+1;
for(;HeapTree[i/2]>value;i/=2)
HeapTree[i]=HeapTree[i/2];
HeapTree[i]=value;
curSize++;
return;
}
void ShowPath(int index){
while(index/2>=1){
cout<<HeapTree[index]<<" ";
index/=2;
}
cout<<HeapTree[index]<<endl;
return;
}
int main(){
int question=0;
int nums=0;
while(cin>>nums>>question){
memset(HeapTree,0,sizeof(0));
HeapTree[0]=-0x3f3f3f3f;
int t=0;
for(int i=1;i<=nums;i++){
cin>>t;
Insert(t);
}
for(int i=0;i<question;i++){
cin>>t;
ShowPath(t);
}
}
}