源代码如下
#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); }
运行结果
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 04:02:07