源代码如下:
#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 PQinit(int maxN){
pq = (node)malloc(maxN*sizeof(node));
N = 0;
}
int PQempty(){
return N==0;
}
void PQinsert(Item v){
pq[N++] = v;
}
Item PQdelmax(){
int j , max = 0;
for(j=1;j<N;j++)
if(pq[max].data<pq[j].data) max = j;
swap(pq[max],pq[N-1]);
return pq[--N];
}
//自底向上堆化 完全二叉树 父节点的关键值大于等于子节点关键值
void fixUp(Item a[],int k){ //k表示破坏堆规则的位置
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++; //