#include<iostream>
using namespace std;
int heap_length;
int heap_size;
void exchange(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
int left(int i){
return 2*i+1;
}
int right(int i){
return 2*i+2;
}
int parent(int i){
return (i-1)/2;
}
void heapifx(int *arry,int i){
int l=left(i);
int r=right(i);
int largest=i;
if((l+1)<=heap_size&&arry[l]>arry[i])
largest=l;
else largest=i;
if((r+1)<=heap_size&&arry[r]>arry[largest])
largest=r;
if(largest==i)
return ;
exchange(arry[i],arry[largest]);
heapifx(arry,largest);
}
void build_heap(int *arry,int n){
int i;
for(i=heap_size/2;i>=0;i--){
heapifx(arry,i);
}
}
void show_heap(int *arry,int i){
for(int j=0;j<i;j++)
cout<<arry[j]<<" ";
cout<<endl;
}
void heap_sort(int *arry,int n){
for(int i=n;i>1;i--){
exchange(arry[0],arry[heap_size-1]);
heap_size--;
heapifx(arry,0);
}
}
/*****返回优先队列 最大键值的元素*****/
int maxnum(int *arry){
return arry[0];
}
/*****去掉并返回优先队列最大键值的元素*****/
int extract_max(int *arry){
if(heap_size<1){
cout<<"error heap underflow";
return -1;
}
int max=arry[0];
arry[0]=arry[heap_size-1];
heap_size=heap_size-1;
heapifx(arry,0);
return max;
}
/*****将优先队列元素i的关键字增加到key*****/
void increase_key(int *arry,int i,int key){
if(key<arry[i]){
cout<<"error new key is smaller than current key.\n";
return ;
}
arry[i]=key;
while(i>0&&arry[parent(i)]<arry[i]){
exchange(arry[i],arry[parent(i)]);
i=parent(i);
}
}
/*****将元素key插入到优先队列中*****/
void heap_insert(int*arry,int key){
heap_size=heap_size+1;
arry[heap_size-1]=-9999;
increase_key(arry,heap_size-1,key);
}
int main(int argc,char**argv){
int arry[20]={16,14,10,8,7,9,3,2,4,1};
heap_size=10;
cout<<"Build heap: ";
build_heap(arry,heap_size);
show_heap(arry,heap_size);
cout<<"maxnum:";
cout<<maxnum(arry)<<endl;
cout<<"Heap extract_max: ";
cout<<extract_max(arry)<<endl;
show_heap(arry,heap_size);
cout<<"increase heap element 5 to key 13: ";
increase_key(arry,5,13);
show_heap(arry,heap_size);
cout<<"Heap insert 40: ";
heap_insert(arry,40);
show_heap(arry,heap_size);
return 0;
}
用堆实现优先队列
最新推荐文章于 2020-02-12 16:20:30 发布