最大堆:根结点的键值是所有堆结点键值中最大者。
最小堆:根结点的键值是所有堆结点键值中最小者。
而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。
最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。
以最大(小)层结点为根结点的子树保有最大(小)堆性质:根结点的键值为该子树结点键值中最大(小)项。
打开IDE
我们来创建一个工程
类声明如下
#if !defined(AFX_MINHEAP_H__5F262696_5BC2_4DC3_BD5A_54F6DEAD15DA__INCLUDED_) #define AFX_MINHEAP_H__5F262696_5BC2_4DC3_BD5A_54F6DEAD15DA__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "stdafx.h" //最小堆的类定义minheap.h #define HeapSIZE 10 #define MaxHeapSize 100 class minheap {private: ElemType *heapArray; int maxheapSize; int heapsize; public: //构造一个空堆S minheap(int); //堆存在则堆被销毁 void Destroyheap(); //堆存在则清为空堆 void Clearheap(); //堆空则返回true,否则false bool heapEmpty(); //堆满则返回true,否则false bool heapFull(); // 堆存在则返回堆的元素个数,即堆的长度 int heapLength(); //堆存在且非空则返回堆的堆顶元素 ElemType GetTop(); // 插入后的堆调整,使之符合最小堆的定义 void FilterUp(); //删除后的堆调整,使之符合最小堆的定义 void FilterDown(); //堆插入 void heapInsert(ElemType item); //堆删除 ElemType heapDelete(); }; #endif // !defined(AFX_MINHEAP_H__5F262696_5BC2_4DC3_BD5A_54F6DEAD15DA__INCLUDED_)
类实现如下
#include "stdafx.h" #include "minheap.h" //最小堆的实现minheap.cpp #include "minheap.h" minheap::minheap(int MaxSize) {if(MaxSize<=0) { cerr<<"参数MaxSize非法!\n";exit(1);} heapArray=(ElemType *) new ElemType[MaxSize]; if(!heapArray) exit(-1); maxheapSize=HeapSIZE; heapsize=0; } void minheap::Destroyheap() {free(heapArray);} void minheap::Clearheap() {heapsize=0;} bool minheap::heapEmpty() { if(heapsize==0) return true; else return false; } bool minheap::heapFull() {return heapsize==maxheapSize;} int minheap::heapLength() { return heapsize;} ElemType minheap::GetTop() { if(heapsize==0) {cerr<<"堆已空!\n";exit(1);} return heapArray[0]; } void minheap::FilterUp() {int c,p; ElemType temp; c=heapsize-1; p=(c-1)/2; temp=heapArray[c]; while(c!=0) {if(heapArray[p]<=temp) break; heapArray[c]=heapArray[p]; c=p; p=(c-1)/2;} heapArray[c]=temp; } void minheap::FilterDown() {int c,p; ElemType temp; p=0; c=2*p+1; temp=heapArray[p]; while(c<heapsize) {if(c+1<heapsize&&heapArray[c+1]<heapArray[c]) c=c+1; if(temp<=heapArray[c]) break; heapArray[p]=heapArray[c]; p=c; c=2*p+1;} heapArray[p]=temp; } void minheap::heapInsert(ElemType item) {if(heapsize==HeapSIZE) {cerr<<"堆已满!\n";exit(1);} heapArray[heapsize]=item; heapsize++; FilterUp(); } ElemType minheap::heapDelete() {ElemType temp; if(heapsize==0) {cerr<<"堆已空!\n";exit(1);} temp=heapArray[0]; heapArray[0]=heapArray[heapsize-1]; heapsize--; FilterDown(); return(temp);}
类调用如下
#include "stdafx.h" #include "minheap.h" void PrintArray(int a[],int n) {for(int i=0;i<n;i++) cout<<setw(3)<<a[i]; cout<<endl; } void main() {cout<<"运行结果:\n"; ElemType b[10]; srand(350); for(int i=0;i<10;i++) b[i]=rand()%100; cout<<"输出数组b:\n"; PrintArray(b,10); minheap H(10),H1(10); for(int i=0;i<10;i++) H.heapInsert(b[i]); cout<<"输出当前堆H的堆顶元素:\n"; cout<<setw(3)<<H.GetTop()<<endl; cout<<"输出插入后数组b:\n"; PrintArray(b,10); cout<<"输出逐个删除的H堆中元素:\n"; while(!H.heapEmpty()) cout<<setw(3)<<H.heapDelete(); cout<<endl; for(int i=0;i<10;i++) H1.heapInsert(rand()%100); cout<<"输出当前堆H1的堆顶元素:\n"; cout<<setw(3)<<H1.GetTop()<<endl; cout<<"输出逐个删除的H1堆中元素:\n"; while(!H1.heapEmpty()) cout<<setw(3)<<H1.heapDelete(); cout<<endl; H.Destroyheap();H1.Destroyheap(); getch();}
效果如下
代码下载