源码例如以下:
#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("\n\n排序后\n\n");
headSort(a,1,8);
for(k=1;k<=7;k++)
printf("%d ",a[k].data);
}
程序执行结果