#ifndef __ZCPPMAIN__ZCSORT_LIST_H__ #define __ZCPPMAIN__ZCSORT_LIST_H__ /*//////////////////////////////////////////////////// ¡á CDoublieList.H ¿Í CObjList.H °¡ include ÇÑ´Ù. -- 2013-04-30 22:57:00 ////////////////////////////////////////////////////*/ #include "ZCppMain/ZMainHead.H" namespace ZNsMain { // ¾ç¹æÇâ ¿¬°á¸®½ºÆ®¿¡ ´ëÇÑ Á¤·Ä Ŭ·¡½ºÀÌ´Ù. template class ZtCSortObjList { public : typedef typename TTypObjList::ZCLink ZCLink ; typedef typename TTypObjList::TypeData TypeData; typedef typename TTypObjList::TypeArg TypeArg ; typedef typename TTypObjList::TypeSize TypeSize; private: static inline bool IsMore(TypeArg AR_LeftType, TypeArg AR_RightType) { /* IsMore() ÇÔ¼ö¿Í IsLess() ´Â QuickSort() ¸â¹ö ÇÔ¼ö¿¡¼­ ¾²´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÀÔÇϱâ À§Çؼ­ Á¤ÀÇÇÏ¿´´Ù. */ return AR_LeftType > AR_RightType ; }/* static inline bool IsMore(TypeArg AR_LeftType, TypeArg AR_RightType)*/ static inline bool IsLess(TypeArg AR_LeftType, TypeArg AR_RightType) { return AR_LeftType < AR_RightType ; }/* static inline bool IsLess(TypeArg AR_LeftType, TypeArg AR_RightType)*/ static inline void SwapLinkPtr(ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) { ZCLink* VP_Temp=APR_LinkI; APR_LinkI=APR_LinkJ; APR_LinkJ=VP_Temp; }/* static inline void SwapLinkPtr( ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) */ template static void QuickSort ( TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess , ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex , TypeSize AL_LastIndex ) /*##################################################*/ { if(AL_FirstIndexi && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData())); while(AL_FirstIndexGetData(), VP_PivotLinkPtr->GetData())); if(i static void QuickSort ( TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess , ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex , TypeSize AL_LastIndex ) ###########################################################*/ static void QuickSortAsc ( ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex ) /*####################*/ { if(AL_FirstIndexi && APA_LinkPtrArr[++i]->GetData() < VP_PivotLinkPtr->GetData()); while(AL_FirstIndexGetData() > VP_PivotLinkPtr->GetData()); if(ii && APA_LinkPtrArr[++i]->GetData() > VP_PivotLinkPtr->GetData()); while(AL_FirstIndexGetData() < VP_PivotLinkPtr->GetData()); if(iGetNextPtr(); }/* for(; i static void QuickSort ( TTypObjList& ARR_CObjList , TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess ) ////////////////////////////////////////////////////// { if(ARR_CObjList.GetSize()<=1) return; TypeSize VL_SortSize = ARR_CObjList.GetSize() ; ZCLink** VPP_LinkPtrArr= new ZCLink*[VL_SortSize]; if(VPP_LinkPtrArr==0) { // Add codes for memory over return; }/* if(VPP_LinkPtrArr==0)*/ ZCLink* VP_TempLink = ARR_CObjList.GetHeadLinkPtr(); TypeSize i=0 ; for(; iGetNextPtr(); }/* ///////////////////////*/ QuickSort (APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1); for(i=1; i static void QuickSort ( TTypObjList& ARR_CObjList , TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess ) ////////////////////////////////////////////////////*/ static void QuickSortPart /*########################*/ ( TTypObjList& ARR_CObjList, ZCLink* AP_HeadLink , TypeSize AL_HeadPos , ZCLink* AP_TailLink , TypeSize AL_TailPos , bool AB_IsAscending=true ) /*##################################################*/ { // AP_HeadLink ºÎÅÍ AP_TailLink ±îÁö¸¸ Á¤·Ä #ifdef _DEBUG if(ARR_CObjList.IsEmpty()==true || ARR_CObjList.Find(AP_HeadLink)!=AL_HeadPos || ARR_CObjList.Find(AP_TailLink)!=AL_TailPos || AL_HeadPos>AL_TailPos) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<AL_TailPos)*/ #endif //_DEBUG if(AL_HeadPos==1 && AL_TailPos==ARR_CObjList.GetSize()) { QuickSort(ARR_CObjList, AB_IsAscending); return; }/* if(AL_HeadPos==1 && AL_TailPos==ARR_CObjList.GetSize())*/ ZCLink* VP_PrevHead=AP_HeadLink->GetPrevPtr(); ZCLink* VP_NextTail=AP_TailLink->GetNextPtr(); TypeSize VL_SortSize=AL_TailPos-AL_HeadPos+1 ; ZCLink** VPP_LinkPtrArr = new ZCLink*[VL_SortSize]; if(VPP_LinkPtrArr==0) { // Add codes for memory over return; }/* if(VPP_LinkPtrArr==0)*/ ZCLink* VP_TempLink = AP_HeadLink; TypeSize i=0; for(; iGetNextPtr(); }/* ///////////////////////*/ if(AB_IsAscending==true) QuickSortAsc (VPP_LinkPtrArr, 0, VL_SortSize-1); else QuickSortDesc(VPP_LinkPtrArr, 0, VL_SortSize-1); for(i=1; imp_PrevLink, ARR_AddList.ml_Size ); ARR_CutList.OnDelete( ARR_CutList.mp_HeadLink, 1, ARR_CutList.mp_HeadLink->mp_PrevLink, ARR_CutList.ml_Size ); bool (*pf_IsTrueValue)(TypeArg AR_Left,TypeArg rRigh); if(AB_IsAscending==true) pf_IsTrueValue=IsMore; else pf_IsTrueValue=IsLess; if(pf_IsTrueValue(ARR_AddList.GetTailData(), ARR_CutList.GetHeadData())==false) { ARR_AddList.JoinTail(ARR_CutList); return; // À̶§´Â ´õ ÀÌ»ó ºñ±³ÇÒ Çʿ䰡 ¾ø´Ù. }/* if(pf_IsTrueValue(ARR_AddList.GetTailData(), ARR_CutList.GetHeadData())==false)*/ ZCLink* VP_LhsTail =ARR_AddList.mp_HeadLink->mp_PrevLink; ZCLink* VP_LhsTemp =ARR_AddList.mp_HeadLink; ZCLink* VP_RhsHead =ARR_CutList.mp_HeadLink; TypeSize VL_LhsTempPos=1 ; // VP_LhsTemp ÀÇ À§Ä¡ bool VB_IsMoved =false; ZCLink* VP_TempLink =0 ; do ////// { if(pf_IsTrueValue(VP_LhsTemp->GetData(), VP_RhsHead->GetData())==true) { VP_TempLink=VP_RhsHead; VP_RhsHead =VP_RhsHead->mp_NextLink; ARR_AddList.JoinBefore( ARR_CutList.CutLink(VP_TempLink,1), VP_LhsTemp, VL_LhsTempPos /*/////////////////*/ ); ////////////////////////////////// /* VP_LhsTemp ¾Õ¿¡ ¸µÅ©°¡ Çϳª »ðÀԵǾúÀ¸¹Ç·Î, VP_LhsTemp ÀÇ À§Ä¡°ªÀ» Çϳª Áõ°¡½ÃŲ´Ù. */ ++VL_LhsTempPos; VB_IsMoved=true; }/* if(pf_IsTrueValue(VP_LhsTemp->GetData(), VP_RhsHead->GetData())==true)*/ if(ARR_CutList.mp_HeadLink==0) return; if(VP_LhsTemp==VP_LhsTail) { ARR_AddList.JoinTail(ARR_CutList); return; }/* if(VP_LhsTemp==VP_LhsTail)*/ if(VB_IsMoved==false) { VP_LhsTemp=VP_LhsTemp->mp_NextLink; ++VL_LhsTempPos; } else { VB_IsMoved=false; } } while(true); }/* static void MergeSort (TTypObjList& ARR_AddList, TTypObjList& ARR_CutList, bool AB_IsAscending=true) /*#################*/ template void MakeUnique( /*############*/ TTypObjList& ARR_CObjList , TFunctor AR_Functor , bool AB_IsSorted =false, bool AB_IsAscending=true /*#########*/ ) /*#########################################*/ { // ARR_CObjList ÀÇ °¢ ³ëµå¸¦ À¯ÀÏÇÏ°Ô ¸¸µç´Ù. if(AB_IsSorted==false) QuickSort(ARR_CObjList,AB_IsAscending); TypeSize VL_LoopSize= ARR_CObjList.GetSize() ; TypeSize VL_Index = 1 ; ZCLink* VP_HeadLink= ARR_CObjList.GetHeadLinkPtr(); ZCLink* VP_CutLink = 0 ; /* VL_LoopSize-1 ¹ø ¼øÈ¯ÇÏ¸ç °°Àº ¿ø¼Ò°¡ ÀÌ¿ôÇÑ´Ù¸é ¾ÕµÚ ³ëµå¿¡ ´ëÇØ ¾î¶² 󸮸¦ ÇÏ°í µÚÂÊÀÇ ³ëµå¸¦ »èÁ¦ÇÑ´Ù. */ for(TypeSize i=1; iGetData()==VP_HeadLink->GetNextPtr()->GetData()) { AR_Functor ////////////////////////// ( VP_HeadLink->GetData(), VP_HeadLink->GetNextPtr()->GetData() ); VP_CutLink=VP_HeadLink->GetNextPtr(); ARR_CObjList.Delete(VP_CutLink, VL_Index+1); } else { (VP_HeadLink=VP_HeadLink->GetNextPtr(), ++VL_Index); } }/* for(TypeSize i=1; i void MakeUnique( ################ TFunctor AR_Functor , bool AB_IsSorted=false , bool AB_IsAscending=true ################# ) #######################################*/ static void MakeUnique( /*#################################*/ TTypObjList& ARR_CObjList , bool AB_IsSorted =false, bool AB_IsAscending=true /*#########*/ ) /*#########################################*/ { // ARR_CObjList ÀÇ °¢ ³ëµå¸¦ À¯ÀÏÇÏ°Ô ¸¸µç´Ù. if(AB_IsSorted==false) QuickSort(ARR_CObjList,AB_IsAscending); TypeSize VL_LoopSize =ARR_CObjList.GetSize() ; TypeSize VL_Index =1 ; ZCLink* VP_HeadLink =ARR_CObjList.GetHeadLinkPtr(); ZCLink* VP_CutLink =0 ; /* VL_LoopSize-1 ¹ø ¼øÈ¯ÇÏ¸ç °°Àº ¿ø¼Ò°¡ ÀÌ¿ôÇÑ´Ù¸é µÚÂÊÀÇ ³ëµå¸¦ »èÁ¦ÇÑ´Ù. */ for(TypeSize i=1; iGetData()==VP_HeadLink->GetNextPtr()->GetData()) { VP_CutLink = VP_HeadLink->GetNextPtr() ; ARR_CObjList.Delete(VP_CutLink, VL_Index+1); } else { (VP_HeadLink=VP_HeadLink->GetNextPtr(), ++VL_Index); } }/* for(TypeSize i=1; i static void SplitGroup( /*#####*/ TTypObjList& ARR_CObjList , TFunctor AR_Functor , bool AB_IsSorted =false, bool AB_IsAscending=true /*#########*/ ) /*#########################################*/ { /* ARR_CObjList ÀÇ °¢ ³ëµå¸¦ °°Àº °Í³¢¸® ±×·ìÀ¸·Î ¹¬¾î¼­ ¹­¿©Áø ¸®½ºÆ®¿¡ ´ëÇØ AR_Functor ¸¦ ¼öÇàÇÑ´Ù. */ if(ARR_CObjList.IsEmpty()) return; if(AB_IsSorted==false) { QuickSort(ARR_CObjList, AB_IsAscending); // Á¤·ÄÀÌ ¾ÈµÇ¾úÀ¸¸é Á¤·ÄÀ» Çϰí... }/* if(AB_IsSorted==false)*/ TypeSize VL_LoopSize=ARR_CObjList.GetSize() ; TypeSize VL_TailPos =1 ; ZCLink* VP_CutHead =ARR_CObjList.GetHeadLinkPtr(); ZCLink* VP_CutTail =VP_CutHead ; ZCLink* VP_CutTemp =VP_CutTail->GetNextPtr() ; // VL_LoopSize-1 ¹ø ¼øÈ¯ for(TypeSize i=2; i<=VL_LoopSize; ++i) { if(VP_CutTail->GetData()==VP_CutTemp->GetData()) { VP_CutTail=VP_CutTemp ; VP_CutTemp=VP_CutTemp->GetNextPtr() ; ++VL_TailPos; } else // VP_CutTail->GetData()!=VP_CutTemp->GetData() { /* ´ÙÀ½ ³ëµå¿Í ´Ù¸£¸é ÀÌÀü ³ëµåµéÀº ¼­·Î °°´Ù´Â °ÍÀÌ´Ù. ÀÌÀü ³ëµåµéÀº functor ·Î 󸮸¦ ³Ñ±ä´Ù. functor ´Â ³Ñ°Ü¹ÞÀº ¸®½ºÆ®¸¦ ¹Ýµå½Ã ½á¾ß(»èÁ¦Çؾß) ÇÑ´Ù. CutLink() ¸â¹ö ÇÔ¼ö´Â ³»ºÎ¿¡ Á¤Àû ¸®½ºÆ® °³Ã¼¸¦ °¡Áö°í Àִµ¥ ¿©±â¿¡ ¾µµ¥¾ø´Â ÀÚ·á°¡ ³²°ÜÁ®¼­´Â ¾ÈµÇ±â ¶§¹®ÀÌ´Ù. */ AR_Functor ////////////////////////////////////// ( ARR_CObjList.CutLink ( VP_CutHead, 1, VP_CutTail, VL_TailPos ) ); ///////////////////////////////////////////////// VP_CutHead =VP_CutTemp; VP_CutTail =VP_CutTemp; VP_CutTemp =VP_CutTemp->GetNextPtr(); VL_TailPos =1 ; }/* else // VP_CutTail->GetData()!=VP_CutTemp->GetData()*/ }/* for(TypeSize i=2; i<=VL_LoopSize; ++i)*/ if(ARR_CObjList.IsEmpty()==false) AR_Functor(ARR_CObjList); }/* template static void SplitGroup( ########## TTypObjList& ARR_CObjList , TFunctor AR_Functor , bool AB_IsSorted=false , bool AB_IsAscending=true ############# ) ############################################*/ public: };/* template class ZtCSortObjList */ // ´Ü¹æÇâ ¿¬°á¸®½ºÆ®¿¡ ´ëÇÑ Á¤·Ä Ŭ·¡½ºÀÌ´Ù. template class ZtCSortSimList { public : typedef typename TTypObjList::ZCLink ZCLink ; typedef typename TTypObjList::TypeData TypeData ; typedef typename TTypObjList::TypeArg TypeArg ; typedef typename TTypObjList::TypeSize TypeSize ; private: static inline void SwapLinkPtr(ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) { ZCLink* VP_Temp =APR_LinkI; APR_LinkI=APR_LinkJ; APR_LinkJ=VP_Temp; }/* static inline void SwapLinkPtr( ZCLink*& APR_LinkI, ZCLink*& APR_LinkJ) */ template static void QuickSort ( TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess , ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex , TypeSize AL_LastIndex ) /*##################################################*/ { if(AL_FirstIndexi && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData())); while(AL_FirstIndexGetData(), VP_PivotLinkPtr->GetData())); if(i static void QuickSort ( TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess , ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex , TypeSize AL_LastIndex ) /*##################################################*/ /*private:*/ public : template static void QuickSort ( TTypObjList& ARR_CObjList, TTypFuncIsMore APF_IsMore , TTypFuncIsLess APF_IsLess ) /*##################################################*/ { if(ARR_CObjList.GetSize()<=1) return; TypeSize VL_SortSize = ARR_CObjList.GetSize() ; ZCLink** VPP_LinkPtrArr = new ZCLink*[VL_SortSize]; if(VPP_LinkPtrArr==0) { // Add codes for memory over return; }/* if(VPP_LinkPtrArr==0)*/ ZCLink* VP_TempLink = ARR_CObjList.GetHeadLinkPtr(); TypeSize i=0 ; for(; iGetNextPtr(); } ///////////////////////// QuickSort(APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1); for(i=1; i static void QuickSort(TTypObjList& ARR_CObjList, TTypFuncIsMore APF_IsMore, TTypFuncIsLess APF_IsLess) */ public: };/* template class ZtCSortSimList */ }/* namespace ZNsMain*/ #endif //__ZCPPMAIN__ZCSORT_LIST_H__