1.结构性:是一个彻底二叉树(因此能够用数组储存)算法
2.有序性:任意结点的关键字都是其子树全部结点的最大值数组
用数组的方式来表示最大堆函数
typedef int ElementType; #define MaxDate 100000; typedef struct HeapStruct{ ElementType *Elements; int Size;//当前元素个数 int Capacity;//堆的容量 }*MaxHeap;
最大堆的操做:
ui
建立一个最大堆code
MaxHeap Create(int MaxSize) { MaxHeap H=(MaxHeap)malloc(sizeof(HeapStruct)); H->Elements=(ElementType *)malloc(sizeof(ElementType)*(MaxSize+1)); H->Size=0; H->Capacity=MaxSize; H->Elements[0]=MaxDate;//哨兵 return H; }
最大堆的插入ci
算法:将新增结点插入到其父节点到根结点的这条路径上it
void Insert(MaxHeap H,ElementType Item) { int i=++H->Size; for(;H->Elements[i/2]<Item;i/=2)//i向上移 { H->Elements[i]=H->Elements[i/2];//父节点向下移 } H->Elements[i]=Item; }
最大堆的删除for循环
算法:将最后一个结点替换到根结点的位置,而后与其左右儿子中较大的比较,若是父节点小,则将儿子结点向上移class
父节点向下移。不然找到正确的位置。时间复杂度为logn。二叉树
ElementType Delete(MaxHeap H) { int parent,child; ElementType MaxItem,term; MaxItem = H->Elements[1]; term=H->Elements[H->Size--]; for(parent=1;2*parent<=H->Size;parent=child)//parent指示要移动到的位置,位置向下移 { child = 2*parent; if(child+1<=H->Size&&H->Elements[child]<H->Elements[child+1]) child++;//child指示左右儿子中较大的那个 if(term>=H->Elements[child]) break; else { H->Elements[parent]=H->Elements[child];//儿子向上移 } } H->Elements[parent]=term; return MaxItem; }
最大堆的创建
算法1:将给定元素一个一个插入到最大堆中,每一个元素插入的时间复杂度为O(logn),一共n个元素,整体时间复杂度为O(nlog(n))
算法2:将给定元素依次进入堆中,知足最大堆结构特性。再从最后一个父节点开始调整(调整策略同删除操做,即向下过滤)。时间复杂度为O(n)
MaxHeap BuildMaxHeap( MaxHeap H ) { /* 这里假设全部H->Size个元素已经存在H->Elements[]中 */ /* 本函数将H->Elements[]中的元素调整,使知足最大堆的有序性 */ int Parent, Child, i; ElementType temp; for( i = H->Size/2; i>0; i-- ) { /*从最后一个结点的父结点开始调整 */ temp = H->Elements[i]; for( Parent=i; Parent*2<=H->Size; Parent=Child ) { /* 向下过滤 */ Child = Parent * 2; if( (Child!= H->Size) && (H->Elements[Child] < H->Elements[Child+1]) ) Child++; /* Child指向左右子结点的较大者 */ if( temp >= H->Elements[Child] ) break; else /* 移动temp元素到下一层 */ H->Elements[Parent] = H->Elements[Child]; } /* 结束内部for循环对以H->Elements[i]为根的子树的调整 */ H->Elements[Parent] = temp; } return H; }