heapSort之应用

来源:互联网 发布:淘宝借贷逾期 编辑:程序博客网 时间:2024/04/24 23:25

写了一个类库,有两个版本:

版本一:

#include<iostream>#include<cmath>#include<cstdlib>using namespace std;template <typename type> class Schedule{public:Schedule():cnt(0){}~Schedule(){}type GetMax();type ExtractMax();void Insert(type);bool empty();int size();private:type scheme[1000000];int cnt;void BuildHeap();void Heapify(int);int GetLeftChild(int);int GetRightChild(int);int GetParent(int);};template<typename type> type Schedule<type>::GetMax(){return scheme[1];}template<typename type> type Schedule<type>::ExtractMax(){type val=scheme[1];scheme[1]=scheme[cnt--];Heapify(1);return val;}template<typename type> void Schedule<type>::Insert(type value){scheme[++cnt]=value;int curpos=cnt;int ppos=GetParent(curpos);while(ppos>0&&scheme[ppos]<scheme[curpos]){swap(scheme[ppos],scheme[curpos]);curpos=ppos;ppos=GetParent(curpos);}}template<typename type> int Schedule<type>::size(){return cnt;}template<typename type> bool Schedule<type>::empty(){return cnt==0;}template<typename type> void Schedule<type>::Heapify(int pos){int lt,rt,max;lt=GetLeftChild(pos);rt=GetRightChild(pos);max=pos;if(lt<=cnt&&scheme[lt]>scheme[max])max=lt;if(rt<=cnt&&scheme[rt]>scheme[max])max=rt;if(max!=pos){swap(scheme[max],scheme[pos]);Heapify(max);}}template<typename type> void Schedule<type>::BuildHeap(){for(int i=floor(cnt/2);i>0;--i){Heapify(i);}}template<typename type> int Schedule<type>::GetLeftChild(int pos){return 2*pos; }template<typename type> int Schedule<type>::GetRightChild(int pos){return 2*pos+1;}template<typename type> int Schedule<type>::GetParent(int pos){return floor(pos/2);}

版本二(这个版本比较挫,不过没有空间限制了...而且是标准C++)


#include<iostream>#include<vector>#include<iterator>#include<cmath>#include<cstdlib>using namespace std;template <typename type> class Schedule{public:Schedule(){}~Schedule(){}type GetMax();type ExtractMax();void Insert(type);bool empty();int size();private:vector<type> vec;void BuildHeap();void Heapify(typename vector<type>::iterator);typename vector<type>::iterator GetLeftChild(typename vector<type>::iterator);typename vector<type>::iterator GetRightChild(typename vector<type>::iterator);typename vector<type>::iterator GetParent(typename vector<type>::iterator);};template<typename type> type Schedule<type>::GetMax(){return *vec.begin();}template<typename type> type Schedule<type>::ExtractMax(){type val=*vec.begin();*vec.begin()=*(vec.end()-1);vec.pop_back();Heapify(vec.begin());return val;}template<typename type> void Schedule<type>::ViewAll(){if(vec.size()==0){cout<<"The schedule is empty."<<endl;exit(0);}for(typename vector<type>::iterator iter=vec.begin();iter!=vec.end();++iter){cout<<*iter<<endl;}}template<typename type> void Schedule<type>::Insert(type value){vec.push_back(value);typename vector<type>::iterator iter=vec.end()-1;typename vector<type>::iterator pit=GetParent(iter);while(pit>=vec.begin()&&*pit<*iter){swap(*pit,*iter);iter=pit;pit=GetParent(iter);}}template<typename type> int Schedule<type>::size(){return vec.size();}template<typename type> bool Schedule<type>::empty(){return vec.empty();}template<typename type> void Schedule<type>::Heapify(typename vector<type>::iterator iter){ typename vector<type>::iterator lt=GetLeftChild(iter); typename vector<type>::iterator rt=GetRightChild(iter); typename vector<type>::iterator max=iter;         if(lt<vec.end()&&*lt>*max)max=lt; if(rt<vec.end()&&*rt>*max) max=rt; if(max!=iter) { swap(*max,*iter); Heapify(max); }}template<typename type> void Schedule<type>::BuildHeap(){ for(typename vector<type>::iterator it=vec.begin()+floor(vec.size()/2);it>=vec.begin();--it) { Heapify(it); }}template<typename type> typename vector<type>::const_iterator Schedule<type>::GetLeftChild(typename vector<type>::iterator iter){return iter+(iter-vec.begin()+1);}template<typename type> typename vector<type>::iterator Schedule<type>::GetRightChild(typename vector<type>::iterator iter){return iter+(iter-vec.begin()+2);}template<typename type> typename vector<type>::iterator Schedule<type>::GetParent(typename vector<type>::iterator iter){return vec.begin()+floor((iter-vec.begin()+1)/2)-1;}

剩下的还有其他的算法导论上都说的很清楚了.

0 0
原创粉丝点击