“优先队列” (Priority Queue)是特殊的“队列”,从队列中取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。
采用完全二叉树表示优先队列
堆的特性:
结构性:用数组表示的完全二叉树;
有序性:根结点到任一结点的关键字序列保持非递增(称“最大堆(MaxHeap)”,也称“大顶堆” )或者非递减(称“最小堆(MinHeap)”,也称“小顶堆” )。
【定义】 采用完全二叉树存储的优先队列 称为堆(Heap)。
#include<iostream>
#include<cstdio>
using namespace std;
int heap[105]; //用来存放堆的数组
int n; //用来存储堆中元素的个数,也就是堆的大小
//向下调整函数
void Filterdown(int start) //传入一个需要向下调整的节点编号i,这里传入1,即从堆的顶点开始向下调整
{
int i=start,j=i*2;
int temp=heap[i];
while(j<=n){
if(j<n && heap[j]>heap[j+1]) j++;//比较左右子节点选最小的
if(heap[j]>=temp) break;//如果子节点最小的数比根小
else{
heap[i]=heap[j];
i=j;
j=j*2;
}
}
heap[i]=temp;
}
//插入操作
void FilterUp(int end) {
int j=end,i=j/2;
int temp=heap[j];
while(j>1){
if(heap[i]<=temp) break;//父比子小,符合
else{
heap[j]=heap[i];
j=i;
i=i/2;
}
}
heap[j]=temp;
}
//建立堆的函数
void CreatHeap(int a[])
{
//从最后一个非叶节点到第1个节点依次向上调整
for(int i=n/2;i>=1;--i)
Filterdown(i);
}
int main()
{
int i,num;
//读入需要排序的数字个数
int a[100];
cin>>num;
for(i=1;i<=num;i++)
cin>>heap[i];
n=num;
//建堆
CreatHeap(heap);
//删除顶部元素,连续删除n次,其实也就是从小到大把数输出来
for(i=1;i<=num;i++)
cout<<heap[i]<<" ";
int x;
cout<<endl;
cout<<"插入:";
cin>>x;
heap[n+1]=x;
FilterUp(n+1);
n++;
for(i=1;i<=n;i++)
cout<<heap[i]<<" ";
return 0;
}