#include <stdio.h> #include <stdlib.h> typedef struct HeapStruct *MaxHeap; struct HeapStruct{ ElementsType *Elements; int ESize; int Capacity; }; bool isFull(MaxHeap H) { return (H->ESize == H->Capacity); } bool isEmpty(MaxHeap H){ return (H->ESize == 0); } MaxHeap Create(int MaxSize) { MaxHeap H = malloc(sizeof(struct HeapStruct)); H->Elements = malloc((MaxSize + 1) * sizeof(ElementsType)); H->ESize = 0; H->Capacity = MaxSize; H->Elements[0] = MaxData; return H; } void Insert(MaxHeap H, ElementsType item) { //T(N) = O(logN) int i; if(isFull(H)){ printf("最大堆已满 "); return; } i = ++H->ESize; for( ; H->Elements[i / 2] < item; i /= 2) H->Elements[i] = H->Elements[i / 2]; H->Elements[i] = item; } ElementsType DeleteMax(MaxHeap H) { int Parent, Child; //位置标记 ElementsType MaxItem, temp; if(isEmpty(H)){ printf("最大堆已空 "); return; } MaxItem = H->Elements[1]; temp = H->Elements[H->ESize]; H->ESize--; for(Parent = 1; Parent * 2 <= H->ESize; Parent = Child){ //只要当前位置(Parent所指向)还有儿子结点,就继续循环判断 Child = Parent * 2; if(Child != H->ESize && (H->Elements[Child] < H->Elements[Child + 1])) Child++; if(temp >= H->Elements[Child]) break; else H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = temp; return MaxItem; } void PrecDown(MaxHeap H, int p) { int Parent, Child; ElementsType X; X = H->Elements[p]; for(Parent = p; Parent * 2 <= H->ESize; Parent = Child){ Child = Parent * 2; if(Child != H->ESize && (H->Elements[Child] < H->Elements[Child + 1])) Child++; if(X >= H->Elements[Child]) break; else H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = X; } void BuildHeap(MaxHeap H) { //假设所有H->ESize个元素已经存在H->Elements[]中 int i; for(i = H->ESize / 2; i > 0; i++) //从最后一个结点的父节点开始,到根节点1 PrecDown(H, i); }