正文

最小堆优先队列C++实现2007-03-27 16:49:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/andyhou/24323.html

分享到:

                最小堆的优先队列实现。     在建立最小堆或最大堆时。最主要的就是理解。SiftDown和SiftUp算法的实现问题。其实我觉得自己在画一棵树。先比较左右再比较父点之间。是最大堆往上。最小堆往下。就很能理解了, 下面程序是最小堆。#include <iostream>using namespace std; template<class Elem>class MinHeap{private: Elem* heapArray; int CurrentSize; int MaxSize;public: MinHeap(const int n); virtual~ MinHeap() {  delete []heapArray; } void BuildHeap(); bool isLeaf(int pos) const; int leftChild(int pos) const; int rightChild(int pos) const; //return parent position int parent(int pos) const; //删除给定下标的元素。 bool Remove(int pos,Elem& node); void SiftDown(int left); void SiftUp(int position); bool Insert(const Elem& newNode); Elem& RemoveMin(); bool print() const;};template<class Elem>MinHeap<Elem>::MinHeap(const int n){ if(n<=0)  return ; CurrentSize=0; MaxSize=n; heapArray=new Elem[MaxSize]; BuildHeap();} template<class Elem>void MinHeap<Elem>::BuildHeap(){ for(int i=CurrentSize/2-1;i>=0;i--)  SiftDown(i);} template<class Elem>bool MinHeap<Elem>::isLeaf(int pos) const{ return (pos>=CurrentSize/2) && (pos<CurrentSize);} template<class Elem>int MinHeap<Elem>::leftChild(int pos) const{ return 2*pos+1;} template<class Elem>int MinHeap<Elem>::rightChild(int pos) const{ return 2*pos+2;} template<class Elem>int MinHeap<Elem>::parent(int pos) const{ return (pos-1)/2;}//向下筛选。template<class Elem>void MinHeap<Elem>::SiftDown(int left){ int i=left;          。                  //标记父结点 int j=2*i+1; Elem temp=heapArray[i];  while(j<CurrentSize) {  if((j<CurrentSize-1) && (heapArray[j]>heapArray[i]))     j++;                          //指向右子结点     if(temp>heapArray[j])   {    heapArray[i]=heapArray[j];    i=j;    j=2*j+1;   }     else     break;  } heapArray[i]=temp;}//向上筛选template<class Elem>void MinHeap<Elem>::SiftUp(int position){ int temppos=position; Elem temp=heapArray[temppos]; while((temppos>0) && (heapArray[parent(temppos)]>temp)) {  heapArray[temppos]=heapArray[parent(temppos)];  temppos=parent(temppos); } heapArray[temppos]=temp;} template<class Elem>bool MinHeap<Elem>::Insert(const Elem& newNode){ if(CurrentSize==MaxSize)  return false; heapArray[CurrentSize]=newNode; SiftUp(CurrentSize); CurrentSize++; return true;} template<class Elem>Elem& MinHeap<Elem>::RemoveMin(){ if(CurrentSize==0) {    cout<<"Can't Delete "; } else {  Elem temp=heapArray[0];  heapArray[0]=heapArray[CurrentSize-1];  CurrentSize--;  if(CurrentSize>1)   SiftDown(0);  return temp; }}   template<class Elem>bool MinHeap<Elem>::Remove(int pos,Elem& node){ if((pos<0) || (pos>CurrentSize))  return false; Elem temp=heapArray[pos]; heapArray[pos]=heapArray[--CurrentSize]; SiftUp(pos); SiftDown(pos); node=temp; return true;} template<class Elem>bool MinHeap<Elem>::print() const{  if(CurrentSize<0)   return false;  for(int i=0;i<CurrentSize;i++)   cout<<heapArray[i]<<" ";  return true;} int main(){ MinHeap<char> A(20); char item; int pos; cout<<"Enter 20 number:"<<endl; for(int i=0;i<20;i++) {  cout<<"the"<<i<<"NO: ";  cin>>item;  A.Insert(item); } cout<<"\nPrint all the number: "; A.print(); A.RemoveMin(); cout<<"\nAfter delete the Min number:"; A.print(); cout<<"\nEnter the positon you want:"; cin>>pos; A.Remove(pos,item); cout<<"\nThe data is:"<<item<<endl; return 0;} //程序示例:/*Enter 20 number:the0NO: athe1NO: qthe2NO: zthe3NO: wthe4NO: sthe5NO: xthe6NO: ethe7NO: dthe8NO: cthe9NO: rthe10NO: fthe11NO: vthe12NO: tthe13NO: gthe14NO: bthe15NO: ythe16NO: hthe17NO: nthe18NO: uthe19NO: j Print all the number: a c b d f t e h n j r z v x g y w q u sAfter delete the Min number:c f b d r t e h n j s z v x g y w q uEnter the positon you want:13 The data is:x*/   

阅读(7583) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册