源码例如以下:
#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表示破坏堆规则keyword的位置 ,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 headSort(Item a[],int l,int r){ int k , num = r-l+1; Item *b = a+l-1; for(k = num/2;k>=1;k--) fixDown(b,k,num);//初始化堆结构 while(num>1){ swap(b[1],b[num]); fixDown(b,1,--num); //每删除一个最大值keyword。修正堆结构 } } 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,k ; for(j=1;j<=7;j++) printf("%d ",a[j].data); printf(" 排序后 "); headSort(a,1,8); for(k=1;k<=7;k++) printf("%d ",a[k].data); }
程序执行结果