优先级队列

分为最小优先级队列和最大优先级队列。

优先级队列是一种用来维护一组元素构成的集合s的数据结构,这一组元素都有一个关键字key,一个最大优先级队列支持的操作:

insert(s,x);把x插入到集合s中

maxmum(s);返回s中最大元素

extra_max(s);去掉s中最大关键字并返回该最大关键子

increase_key(s,x,k);将元素x的关键字的值增加到k,这里k的值不小于x的关键字。

#include<iostream> #include<vector> #include<string.h> using namespace std; int n; void max_heapify(int *v,int i); void heapsort(); void build_max_heap(int *v) { for(int i=n/2;i>0;--i) max_heapify(v,i); } void input(int *v) { cin>>n; v[0]=0;//标志位 cout<<"please input array element:"<<endl; for(int i=1;i<=n;++i) cin>>v[i]; build_max_heap(v); } void output(int *v) { for(int i=0;i<=n;++i) cout<<v[i]<<" "; cout<<endl; } void max_heapify(int *v,int i)//递归算法 { int heap_size=n; int l=i<<1,r=(i<<1)+1,largest=i; if(l<=heap_size&&v[l]>v[largest]) largest=l; if(r<=heap_size&&v[r]>v[largest]) largest=r; if(i!=largest) { int temp=v[i]; v[i]=v[largest]; v[largest]=temp; max_heapify(v,largest); } } void max_heapify_effective(int *v,int i)//非递归算法 {int heap_size=n; while(i<=n) { int largest=i; int l=i<<1,r=(i<<1)+1; if(l<=heap_size&&v[l]>v[largest]) largest=l; if(r<=heap_size&&v[r]>v[largest]) largest=r; if(i!=largest) { int temp=v[i]; v[i]=v[largest]; v[largest]=temp; i=largest; } else break; } } void heap_increase_key(int *v,int i,int key)//将堆中位置为i的元素改为key并保持最大堆的性质 { if(key<v[i]){v[i]=key; max_heapify(v,i);} else{ v[i]=key; while(i>1&&v[i/2]<v[i]) { int temp=v[i]; v[i]=v[i/2]; v[i/2]=temp; i=i/2; } } } void max_heap_insert(int *v,int key)//向堆中插入一个元素 { n++; v[n]=-0xfff; heap_increase_key(v,n,key); } int heap_extra_max(int *v)//去掉并返回堆中最大元素 { if(n<1) return 0; int max=v[1]; v[1]=v[n]; n--; max_heapify(v,1); return max; } void heapsort(int *v)//堆排序 { int m=n; for(int i=m;i>1;--i) { int temp=v[i]; v[i]=v[1]; v[1]=temp; n--; max_heapify(v,1); } for(int i=0;i<=m;++i) cout<<v[i]<<" "; cout<<endl; } int main() { int v[20]; cout<<"The Array is size:"; input(v); //cout<<"please input the sort: "; //int i; //cin>>i; //max_heapify(v,i); output(v); cout<<heap_extra_max(v)<<endl; output(v); cout<<"please input insert postion and key;"<<endl; int a, key; cin>>a>>key; heap_increase_key(v,a,key); output(v); cout<<"please input the insert key:"<<endl; cin>>key; max_heap_insert(v,key); output(v); heapsort(v); //max_heapify_effective(v,i); return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值