今天做题,发现需要用到优先级队列,于是看了一下优先级队列。优先级队列是管理一组数的数据结构,优先级队列分为最大优先级队列和最小优先级队列。其结构相当于最大堆和最小堆,最大(最小)的元素位于堆顶,每个子树的跟大于(小于)其左右子树。
用C++实现最大堆和最小堆的一些操作如下:
最大堆:
struct max_heap{
int num[M],size;
int geiSize(){
return size;
}
void siftup(int size){
int j=size;
int middle=(j-1)/2;
int temp=num[j];
while(j>0){
if(temp<=num[middle])
break;
else{
num[j]=num[middle];
j=middle;
middle=(middle-1)/2;
}
}
num[j]=temp;
}
void siftdown(int start,int end){
int j=start;
int middle=2*j+1;
int temp=num[j];
while(middle<=end){
if(middle<end&&num[middle]<num[middle+1])
++middle;
if(temp>=num[middle])
break;
else{
num[j]=num[middle];
j=middle;
middle=2*middle+1;
}
}
num[j]=temp;
}
void insert(int x){
num[size]=x;
siftup(size);
size++;
}
void del(){
num[0]=num[size-1];
size--;
siftdown(0,size-1);
}
}
最小堆
struct min_heap{
int num[M],size;
void siftup(int start){
int j=start;
int middle=(j-1)/2;
int temp=num[j];
while(j>0){
if(temp>=num[middle])
break;
else{
num[j]=num[middle];
j=middle;
middle=(middle-1)/2;
}
}
num[j]=temp;
}
void siftdown(int start,int end){
int j=start;
int middle=2*j+1;
int temp=num[j];
while(middle<=end){
if(middle<end&&num[middle]>num[middle+1])
++middle;
if(temp>num[middle]){
num[j]=num[middle];
j=middle;
middle=2*middle+1;
}
else
break;
}
num[j]=temp;
}
void insert(int x){
num[size]=x;
siftup(size);
size++;
}
void del(){
num[0]=num[size-1];
size--;
siftdown(0,size-1);
}
int getSize(){
return size;
}
}