From 9982ca25af1a52981054af8636dfc5f3e2ea59c9 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 11 Jun 2021 10:22:34 +0800 Subject: [PATCH] added Sort.h --- inc/hgl/util/sort/Sort.h | 172 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 inc/hgl/util/sort/Sort.h diff --git a/inc/hgl/util/sort/Sort.h b/inc/hgl/util/sort/Sort.h new file mode 100644 index 0000000..e77340f --- /dev/null +++ b/inc/hgl/util/sort/Sort.h @@ -0,0 +1,172 @@ +#ifndef HGL_ALGORITHM_SORT_INCLUDE +#define HGL_ALGORITHM_SORT_INCLUDE + +#include +#include +namespace hgl +{ + 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 + + //堆排序 + 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