swim() 表示上浮:作者将其比喻为黑帮新人(插入的新元素),能力高(值大的)的被提升,将能力不够的前辈踩在脚下,直到遇到一个更强的领导。sink ()表示下沉:比喻为黑帮领导,能力不行的或退休的(删除)就被下属取代。每次帮派有新人加入,或有领到退休,帮内都必须重新论资排辈。这个比喻还是挺有意思的。
#include <iostream> using namespace std; class MaxHeap { private: int *a; int N; public: MaxHeap(){ N=0; } MaxHeap(int n){ a=new int[n]; N=0; } ~MaxHeap(){ delete a; } int left(int i) { return 2*i; } int right(int i) { return 2*i+1; } int parent(int i) { return i/2; } bool isEmpty() { return N==0; } bool size() { return N; } void insert(int val){ // 这样a[0]是没有存数据的 //cout<<val<<endl; a[++N]=val; // 每插入一个数,都调用swim,保持最大堆的性质 swim(N); } void swap(int i,int j){ int temp=a[i]; a[i]=a[j]; a[j]=temp; } int delMax(){ int maxVal=a[1]; a[1]=a[N]; sink(1); N--; return maxVal; } void swim(int k){ while(k>1){ if(a[parent(k)]<a[k]){ swap(parent(k),k); k=parent(k); } else break; } } void sink(int k){ // 将a[k]与子节点中较大的交换 while(left(k)<=N){ int j=left(k); // 找到子节点中较大的那一个 if(right(k)<=N && a[left(k)]<a[right(k)]) j=right(k); if(a[k]>a[j]) break; swap(k,j); k=j; } } void show(){ for(int i=1;i<=N;i++){ cout<<a[i]<<" "; } cout<<endl; } }; int main(){ int a[10]= {3,6,2,7,9,0,8,1,4,5}; MaxHeap h(100); for(int i=0;i<10;i++){ h.insert(a[i]); } h.show(); for(int i=0;i<10;i++){ cout<<h.delMax()<<" "; } cout<<endl; return 0; }
原文地址:http://blog.csdn.net/dutsoft/article/details/25558969