最近在学习dijkstra算法和Kruskal算法建立最小生成树时都使用到了最小堆来对算法进行优化。于是就回去重新补了补最小堆的知识。
已知一个数组怎么来建成一个最小堆呢?我使用的方法是自下而上来建堆,将下方的调成一个最小堆后,依次调整上方。
#include<iostream>
using namespace std;
#define MAX 2000000
int H,A[MAX+1];
void makeHeapify(int i){
int l,r,largest;
l=2*i;
r=2*i+1;
if(l<=H&&A[l]>A[i]) largest=l;
else largest=i;
if(r<=H&&A[r]>A[largest]) largest=r; //找左右节点和根中最大的那个
if(largest!=i){
swap(A[i],A[largest]); //调整次序
makeHeapify(largest); //这里递归调用防止调换次序后,对下方已经建好的堆造成影响,所以重新建堆
}
}
int main(){
cin>>H;
for(int i=1;i<=H;i++) cin>>A[i];
for(int i=H/2;i>=1;i--) makeHeapify(i); //从H/2开始建堆,依次往前一个节点找,进行建堆
for(int i=1;i<=H;i++){ //根据完全二叉树的特点,H/2保证从倒数第二层开始建堆
cout<<" "<<A[i];
}
cout<<endl;
return 0;
}
最小堆的化只需将>改为<就行了。