分为最小优先级队列和最大优先级队列。
优先级队列是一种用来维护一组元素构成的集合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;
}