用堆实现优先队列

来源:互联网 发布:tgp腾讯游戏客户端mac 编辑:程序博客网 时间:2024/06/05 01:36
#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;}

0 0
原创粉丝点击