浏览 3950 次
锁定老帖子 主题:实用类之一-----最小堆的实现
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-09
MinHeap.h文件 template<class T> class MinHeap{ public: MinHeap(T a[],int n); MinHeap(int ms); ~MinHeap(); bool Insert(const T &x);//插入一个元素,如果空返回false,否则返回true bool RemoveMin(T &x);//删除最小的元素,如果空返回false,否则返回true void MakeEmpty();//使堆为空 bool IsEmpty(); bool IsFull(); void FilterDown(const int start,const int endOfHeap);//自顶向下构造堆 void FilterUp(const int start);//自底向上构造堆 private: T *heap; int maxSize; const int defaultSize; int currentSize; }; template<class T> MinHeap<T>::MinHeap(int ms):defaultSize(100){ maxSize = ms > defaultSize ? ms : defaultSize; heap = new T[maxSize]; currentSize = 0; } template<class T> MinHeap<T>::MinHeap(T a[],int n):defaultSize(100){ maxSize = n > defaultSize ? n : defaultSize; heap = new T[maxSize]; currentSize = n; heap = a; int curPos = (currentSize - 2) / 2; while(curPos >= 0){ FilterDown(curPos,currentSize - 1); curPos--; } } template<class T> MinHeap<T>::~MinHeap(){ delete []heap; } template<class T> void MinHeap<T>::FilterDown(const int start,const int endOfHeap){ int i = start,j = i * 2 + 1; T temp = heap[i]; while(j <= endOfHeap){ if(j < endOfHeap && heap[j] > heap[j+1]) j++; if(temp < heap[j]) break; else{ heap[i] = heap[j]; i = j; j = 2 * i + 1; } } heap[i] = temp; } template<class T> void MinHeap<T>::FilterUp(const int start){ int i = start, j = ( i - 1 ) / 2; T temp = heap[i]; while(i > 0){ if(temp >= heap[j]) break; else{ heap[i] = heap[j]; i = j; j = (i - 1) / 2; } } heap[i] = temp; } template<class T> bool MinHeap<T>::RemoveMin(T &x){ if(IsEmpty()){ cerr<<"Heap empty!"<<endl; return false; } x = heap[0]; heap[0] = heap[currentSize - 1]; currentSize--; FilterDown(0,currentSize-1); return true; } template<class T> bool MinHeap<T>::Insert(const T& x){ if(IsFull()) { cerr<<"Heap Full!"<<endl; return false; } heap[currentSize] = x; FilterUp(currentSize); currentSize++; return true; } template<class T> bool MinHeap<T>::IsEmpty(){ return currentSize == 0; } template<class T> bool MinHeap<T>::IsFull(){ return currentSize == maxSize; } template<class T> void MinHeap<T>::MakeEmpty(){ currentSize = 0 } main.cpp测试文件: #include<iostream> #include"MinHeap.h" using namespace std; void main(){ int a[5] = {3,2,1,4,5}; MinHeap<int> m_heap(a,5); int x,i; for(i = 0; i < 5; i++){ m_heap.RemoveMin(x); cout << x << " "; } cout << endl; for(i = 0; i < 5; i++){ m_heap.Insert(a[i]); } for(i = 0; i < 5; i++){ m_heap.RemoveMin(x); cout << x << " "; } cout << endl; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-10
都是原创呀,我以前的blog前台用不了了,我把他们都转移到这了。你说数据结构的的东西不写代码表示,用语言说,能说出什么?
|
|
返回顶楼 | |
发表时间:2007-04-10
对于新手还是有用的
建议移到新手区。。。 |
|
返回顶楼 | |
发表时间:2007-04-10
hurricane1026 写道 新手可以google啊。抄袭的东西用啊。。。 而且注释基本没有,对新手来说也是不适合的说.
|
|
返回顶楼 | |
发表时间:2007-05-17
这个程序有问题
|
|
返回顶楼 | |