源代码如下
#include <stdio.h>
#include <stdlib.h>
typedef struct Item *node;
struct Item{
int data;
char c;
};
static Item *pq;
static int N ;
void swap(Item &a,Item &b){struct Item t = a;a = b;b = t;}
//自底向上堆化 完全二叉树 父节点的关键值大于等于子节点关键值
void fixUp(Item a[],int k){ //k表示破坏堆规则的位置 O(NlgN)
while(k>1 && a[k/2].data < a[k].data){
swap(a[k],a[k/2]);
k = k/2;
}
}
//自顶向下堆化
void fixDown(Item a[],int k,int n){ //k表示破坏堆规则关键字的位置 ,n为堆的大小
int j;
while(2*k<=n ){
j = 2*k;
if(j<n && a[j].data<a[j+1].data)j++; //处理好啦K处节点只有一个子节点的情况
if(a[k].data>=a[j].data)break;
swap(a[k],a[j]);
k = j;
}
}
void PQinit(int maxN){
pq = (node)malloc((maxN+1)*sizeof(node));
N = 0;
}
int PQempty(){
return N==0;
}
void PQinsert(Item v){
pq[++N] = v; //pq[0]未用,在某些实现中可以当作观察哨。
fixUp(pq,N);
}
Item PQdelmax(){
swap(pq[1],pq[N]);
fixDown(pq,1,N-1);
return pq[N--];
}
main(){
PQinit(40);
struct Item a[8] = {{0,'0'},{7,'c'},{95,'c'},{12,'c'},{96,'c'},{76,'c'},{36,'c'},{46,'c'}};
int j ;
for(j=1;j<=7;j++) PQinsert(a[j]);
printf("生成的堆有序的完全二叉树结构\n");
for(j=0;j<7;j++)
printf("%d\n",pq[j+1].data);
printf("逐渐取出优先队列的最大值\n");
for(j=0;j<7;j++)
printf("%d\n",PQdelmax().data);
}
运行结果