#ifndef HGL_ALGORITHM_SORT_INCLUDE #define HGL_ALGORITHM_SORT_INCLUDE #include #include template class SortBase { protected: T *buffer; //数据 int number; //数据个数 Comparator *comp; //比较函数类 public: /** * 本类构造函数 * @param buf 数据缓冲区 * @param n 数据个数 * @param c 数据大小比较类 */ SortBase(T *buf,int n,Comparator *c) { buffer =buf; number =n; comp =c; } virtual ~SortBase()=default; int GetCount()const { return number; } int compare(const T &a,const T &b) { return comp->compare(a,b); } virtual int compare_by_index(int a,int b) { return comp->compare(buffer[a],buffer[b]); } virtual void exchange(T &a,T &b) { comp->exchange(a,b); } virtual void exchane_by_index(int a,int b) //交换两个数据 { comp->exchange(buffer[a],buffer[b]); } virtual void cpy(T *dst,T *src) { comp->cpy(dst,src); } virtual void cpy_by_index(int dst,int src) { comp->cpy(buffer+dst,buffer+src); } virtual bool sort()=0; //排序 };//struct SortBase namespace hgl { //堆排序 template class HeapSort:public SortBase { void isift(int i,int n) { int j; T temp; SortBase::cpy(&temp,SortBase::buffer+i); j=2*(i+1)-1; while(j<=n) { if((j::compare_by_index(j,j+1)<0))j++; if(SortBase::compare(temp,SortBase::buffer[j])<0) { SortBase::cpy_by_index(i,j); i=j; j=2*(i+1)-1; } else j=n+1; } SortBase::cpy(SortBase::buffer+i,&temp); } public: /** * 本类构造函数 * @param buf 数据缓冲区 * @param n 数据个数 * @param c 数据大小比较类 */ HeapSort(T *buf,int n,Comparator *c=new Comparator()):SortBase(buf,n,c) { } bool sort() { if(!SortBase::buffer||SortBase::number<2||!SortBase::comp) return(false); int i; int mm=SortBase::number>>1; for(i=mm-1;i>=0;i--) isift(i,SortBase::number-1); for(i=SortBase::number-1;i>=1;i--) { SortBase::exchane_by_index(0,i); isift(0,i-1); } return(true); } };//class HeapSort:public SortBase template bool Sort(T *data,int count,Comparator *comp=new Comparator()) { HeapSort hs(data,count,comp); return hs.sort(); } template bool Sort(List &list,Comparator *comp=Comparator()) { return Sort(list.GetData(), list.GetCount(), comp); } /* //仅实现模拟虚拟成员函数即可,无需整个类重载 template<> int Comparator::compare(const BagCell &it1,const BagCell &it2) const { int r=it1.GetItemID()-it2.GetItemID(); if(r!=0) return r; return it1.count-it2.count; } void BagManage::Sort() { Comparator comp_baginfo; BagCell cell_list[BAG_SLOT_COUNT]; hgl::Sort(cell_list,BAG_SLOT_COUNT,&comp_baginfo); } */ }//namespace hgl #endif//HGL_ALGORITHM_SORT_INCLUDE