算法导论堆实现的最小优先级队列,本来应该用vector来实现的,当时没考虑到MIN_HEAP_INSERT方法会改变堆大小。有空再来改吧。另外不大清楚C++应该用什么来表示正无穷呢
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
void exchange(int &a,int &b){
int temp=b;
b=a;
a=temp;
}
void min_heapify(int *A,int i,int heapsize)
{
int min;
int l=2*i+1;
int r=2*i+2;
if(l<=heapsize-1&&A[l]<A[i])
min=l;
else
min=i;
if(r<=heapsize-1&&A[r]<A[min])
min=r;
if(min!=i){
exchange(A[i],A[min]);
min_heapify(A,min,heapsize);
}
}
void build_min_heap(int *A,int heapsize){
for(int i=heapsize/2-1;i>=0;i--)
min_heapify(A,i,heapsize);
}
int heap_minimum(int *A){
return A[0];
}
int heap_extract_min(int *A,int &heapsize){
if(heapsize<1){
cout<<"heap underflow"<<endl;
return NULL;
}
int min=A[0];
A[0]=A[heapsize-1];
heapsize=heapsize-1;
min_heapify(A,0,heapsize);
return min;
}
void heap_decrease_key(int *A,int i,int key){
if(key>A[i]){
cout<<"new key is larger than current key"<<endl;
return;
}
A[i]=key;
int parent;
while(i>0){
parent=((i%2==0)?i/2-1:i/2);
if(A[parent]>A[i]){
exchange(A[parent],A[i]);
i=parent;
}
}
}
// void min_heap_insert(vector<int> *A,int key,int &heapsize){
// A->push_back(0);
//
//
//
// }
void print_heap(int *A,int heapsize){
int k=0;int j;
for(int i=0;i<log(heapsize+0.0)/log(2+0.0)+1;i++){
for(j=0;j<pow(2+0.0,i+0.0);j++){
if(k+j>=heapsize)break;
cout<<A[k+j]<<" ";
}
k+=j;
cout<<endl;
}
}
int main(){
int A[]={7,8,11,3,5,18,25,9};
build_min_heap(A,8);
print_heap(A,8);
cout<<heap_minimum(A)<<endl;
heap_decrease_key(A,2,1);
print_heap(A,8);
cout<<heap_minimum(A)<<endl;
int i;
cin>>i;
}