参考书籍《数据结构与算法分析——C语言描述》
关于堆的一些基本概念,可参见小zz的另一篇博文。
/*本例程实现的是最小堆,最大堆类似*/ #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #define MAX 13 typedef struct BHeap { int Capacity;//堆的最大容量 int Size;//当前堆大小 int *bh;//堆的数组实现 }BHeap,*BH; BH Init_BH(int Max);//堆的初始化 bool IsFull(BH H);//判断堆是否满 void Insert(int data,BH H);//插入操作 int DeletMin(BH H);//删除最小元 bool IsEmpty(BH H);//判断是否是空 void PrintHeap(BH H); int main() { int i=0; int data[11]={0,14,19,26,65,32,31,21,68,16,13}; BH Heap; Heap=Init_BH(MAX); for(i=1;i<=10;i++) { Insert(data[i],Heap); } PrintHeap(Heap); DeletMin(Heap); PrintHeap(Heap); return 0; } BH Init_BH(int Max) { BH H; H=malloc(sizeof(BHeap)); if(H==NULL) printf("Out of space!\n"); H->bh=malloc(sizeof(int)*(Max+1)); memset(H->bh,0,sizeof(int)*(Max+1)); if(H->bh==NULL) printf("Out of space!\n"); H->Capacity=Max; H->Size=0; H->bh[0]=0; return H; } bool IsFull(BH H) { if(H->Capacity==H->Size) return true;//已满 else return false;//未满 } void Insert(int data,BH H) { int i; if(IsFull(H)) { printf("Binary Heap is full!\n"); return; } for(i=++H->Size;H->bh[i/2]>data;i=i/2)//上滤 { H->bh[i]=H->bh[i/2]; } H->bh[i]=data; } bool IsEmpty(BH H) { if(H->Size==0) return true;//空堆 else return false; } int DeletMin(BH H) { int i,Child; int Min,Last; if(IsEmpty(H)) { printf("Heap is empty!\n"); return H->bh[0]; } Min=H->bh[1]; Last=H->bh[H->Size--]; for(i=1;i*2<=H->Size;i=Child) { Child=i*2;//左儿子 if((Child<H->Size)&&(H->bh[Child]>H->bh[Child+1])) Child++; if(Last>H->bh[Child]) H->bh[i]=H->bh[Child]; else break; } H->bh[i]=Last; return Min; } void PrintHeap(BH H) { int i=0; for(i=1;i<=H->Size;i++) { printf("%d\t",H->bh[i]); } }
时间: 2024-11-11 11:12:08