2021-02-26 17:21:25 +09:00
|
|
|
|
|
|
|
|
|
|
2025-08-17 02:48:15 +09:00
|
|
|
|
#ifndef __ZCPPMAIN__ZCSORT_LIST_H__
|
|
|
|
|
#define __ZCPPMAIN__ZCSORT_LIST_H__
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD> CDoublieList.H <EFBFBD><EFBFBD> CObjList.H <EFBFBD><EFBFBD> include <EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
|
|
|
|
-- 2013-04-30 22:57:00
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
|
|
|
2021-02-26 17:22:31 +09:00
|
|
|
|
#include "ZCppMain/ZMainHead.H"
|
2021-02-26 17:21:25 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace ZNsMain
|
|
|
|
|
{
|
|
|
|
|
|
2025-08-17 02:48:15 +09:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ḯ<EFBFBD><E1B8AE>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|
|
|
|
|
|
|
|
|
template<typename TTypObjList> class ZtCSortObjList
|
2021-02-26 17:21:25 +09:00
|
|
|
|
{
|
2025-08-17 02:48:15 +09:00
|
|
|
|
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() <20>Լ<EFBFBD><D4BC><EFBFBD> IsLess() <20><> QuickSort() <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD>Լ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD>. */
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
static void QuickSort
|
|
|
|
|
(
|
|
|
|
|
TTypFuncIsMore APF_IsMore ,
|
|
|
|
|
TTypFuncIsLess APF_IsLess ,
|
|
|
|
|
ZCLink* APA_LinkPtrArr[],
|
|
|
|
|
TypeSize AL_FirstIndex ,
|
|
|
|
|
TypeSize AL_LastIndex
|
|
|
|
|
)
|
|
|
|
|
/*##################################################*/
|
|
|
|
|
{
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)
|
|
|
|
|
{
|
|
|
|
|
TypeSize i=AL_FirstIndex ;
|
|
|
|
|
TypeSize j=AL_LastIndex+1 ;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i];
|
|
|
|
|
|
|
|
|
|
do //////
|
|
|
|
|
{
|
|
|
|
|
while(AL_LastIndex >i && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData()));
|
|
|
|
|
while(AL_FirstIndex<j && APF_IsMore(APA_LinkPtrArr[--j]->GetData(), VP_PivotLinkPtr->GetData()));
|
|
|
|
|
|
|
|
|
|
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
|
|
|
|
|
}
|
|
|
|
|
while(i<j);
|
|
|
|
|
|
|
|
|
|
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex], APA_LinkPtrArr[j]);
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD>ó<EFBFBD><EFBFBD> 2 <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD>ʾƼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
*/
|
|
|
|
|
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j];
|
|
|
|
|
APA_LinkPtrArr[j ]=VP_PivotLinkPtr ;
|
|
|
|
|
|
|
|
|
|
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, AL_FirstIndex, j-1 );
|
|
|
|
|
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, j+1, AL_LastIndex);
|
|
|
|
|
}/*
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)*/
|
|
|
|
|
}/*
|
|
|
|
|
template
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
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_FirstIndex<AL_LastIndex)
|
|
|
|
|
{
|
|
|
|
|
TypeSize i=AL_FirstIndex ;
|
|
|
|
|
TypeSize j=AL_LastIndex+1 ;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i];
|
|
|
|
|
|
|
|
|
|
do ////
|
|
|
|
|
{
|
|
|
|
|
while(AL_LastIndex >i && APA_LinkPtrArr[++i]->GetData() < VP_PivotLinkPtr->GetData());
|
|
|
|
|
while(AL_FirstIndex<j && APA_LinkPtrArr[--j]->GetData() > VP_PivotLinkPtr->GetData());
|
|
|
|
|
|
|
|
|
|
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
|
|
|
|
|
}
|
|
|
|
|
while(i<j);
|
|
|
|
|
|
|
|
|
|
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex], APA_LinkPtrArr[j]);
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD>ó<EFBFBD><EFBFBD> 2 <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʾƼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.*/
|
|
|
|
|
|
|
|
|
|
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j];
|
|
|
|
|
APA_LinkPtrArr[j ]=VP_PivotLinkPtr ;
|
|
|
|
|
|
|
|
|
|
QuickSortAsc(APA_LinkPtrArr, AL_FirstIndex, j-1 );
|
|
|
|
|
QuickSortAsc(APA_LinkPtrArr, j+1, AL_LastIndex);
|
|
|
|
|
}/*
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)*/
|
|
|
|
|
}/*
|
|
|
|
|
static void QuickSortAsc
|
|
|
|
|
(
|
|
|
|
|
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex
|
|
|
|
|
)
|
|
|
|
|
/*####################*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void QuickSortDesc
|
|
|
|
|
(
|
|
|
|
|
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex
|
|
|
|
|
)
|
|
|
|
|
/*#####################*/
|
|
|
|
|
{
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)
|
|
|
|
|
{
|
|
|
|
|
TypeSize i=AL_FirstIndex ;
|
|
|
|
|
TypeSize j=AL_LastIndex+1;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i];
|
|
|
|
|
|
|
|
|
|
do //////
|
|
|
|
|
{
|
|
|
|
|
while(AL_LastIndex >i && APA_LinkPtrArr[++i]->GetData() > VP_PivotLinkPtr->GetData());
|
|
|
|
|
while(AL_FirstIndex<j && APA_LinkPtrArr[--j]->GetData() < VP_PivotLinkPtr->GetData());
|
|
|
|
|
|
|
|
|
|
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
|
|
|
|
|
}
|
|
|
|
|
while(i<j);
|
|
|
|
|
|
|
|
|
|
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex], APA_LinkPtrArr[j]);
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD>ó<EFBFBD><EFBFBD> 2 <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD>ʾƼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
*/
|
|
|
|
|
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j];
|
|
|
|
|
APA_LinkPtrArr[j ]=VP_PivotLinkPtr ;
|
|
|
|
|
|
|
|
|
|
QuickSortDesc(APA_LinkPtrArr, AL_FirstIndex, j-1);
|
|
|
|
|
QuickSortDesc(APA_LinkPtrArr, j+1, AL_LastIndex);
|
|
|
|
|
}/*
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)*/
|
|
|
|
|
}/*
|
|
|
|
|
static void QuickSortDesc
|
|
|
|
|
(
|
|
|
|
|
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex
|
|
|
|
|
)
|
|
|
|
|
/*#####################*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*private:*/
|
|
|
|
|
public :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void QuickSort(TTypObjList& ARR_CObjList, bool AB_IsAscending=true)
|
|
|
|
|
{
|
|
|
|
|
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(; i<VL_SortSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
VPP_LinkPtrArr[i] =VP_TempLink;
|
|
|
|
|
VP_TempLink =VP_TempLink->GetNextPtr();
|
|
|
|
|
}/*
|
|
|
|
|
for(; i<VL_SortSize; ++i)*/
|
|
|
|
|
|
|
|
|
|
if(AB_IsAscending==true)
|
|
|
|
|
QuickSortAsc (VPP_LinkPtrArr, 0, VL_SortSize-1);
|
|
|
|
|
else QuickSortDesc(VPP_LinkPtrArr, 0, VL_SortSize-1);
|
|
|
|
|
|
|
|
|
|
for(i=1; i<VL_SortSize; ++i) // VL_SortSize-1 <20><> <20><>ȯ
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]);
|
|
|
|
|
}/*
|
|
|
|
|
//////////////////////////*/
|
|
|
|
|
|
|
|
|
|
ZCLink::MakeCircle
|
|
|
|
|
(VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]);
|
|
|
|
|
|
|
|
|
|
ARR_CObjList.mp_HeadLink = VPP_LinkPtrArr[0];
|
|
|
|
|
|
|
|
|
|
delete[] VPP_LinkPtrArr; ////////////////////
|
|
|
|
|
}/*
|
|
|
|
|
static void QuickSort(TTypObjList& ARR_CObjList, bool AB_IsAscending=true)*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
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(; i<VL_SortSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
VPP_LinkPtrArr[i]=VP_TempLink;
|
|
|
|
|
VP_TempLink =VP_TempLink->GetNextPtr();
|
|
|
|
|
}/*
|
|
|
|
|
///////////////////////*/
|
|
|
|
|
|
|
|
|
|
QuickSort
|
|
|
|
|
(APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1);
|
|
|
|
|
|
|
|
|
|
for(i=1; i<VL_SortSize; ++i) // VL_SortSize-1 <20><> <20><>ȯ
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]);
|
|
|
|
|
}/*
|
|
|
|
|
//////////////////////////*/
|
|
|
|
|
|
|
|
|
|
ZCLink::MakeCircle
|
|
|
|
|
(VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]);
|
|
|
|
|
|
|
|
|
|
ARR_CObjList.mp_HeadLink = VPP_LinkPtrArr[0];
|
|
|
|
|
|
|
|
|
|
delete[] VPP_LinkPtrArr; ////////////////////
|
|
|
|
|
}/*
|
|
|
|
|
template
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
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 <20><><EFBFBD><EFBFBD> AP_TailLink <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
#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<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
|
|
|
|
|
fileout<<"Error !! In static void QuickSortPart("<<endl
|
|
|
|
|
<<" TTypObjList& ARR_CObjList,"<<endl
|
|
|
|
|
<<" ZCLink* AP_HeadLink ,"<<endl
|
|
|
|
|
<<" TypeSize AL_HeadPos ,"<<endl
|
|
|
|
|
<<" ZCLink* AP_TailLink ,"<<endl
|
|
|
|
|
<<" TypeSize AL_TailPos ,"<<endl
|
|
|
|
|
<<" bool AB_IsAscending=true )"<<endl
|
|
|
|
|
<<"Parameters are not valid"<<endl;
|
|
|
|
|
fileout.close();
|
|
|
|
|
exit(1);
|
|
|
|
|
}/*
|
|
|
|
|
if(ARR_CObjList.IsEmpty()==true || ARR_CObjList.Find(AP_HeadLink)!=AL_HeadPos || ARR_CObjList.Find(AP_TailLink)!=AL_TailPos || AL_HeadPos>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(; i<VL_SortSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
VPP_LinkPtrArr[i]=VP_TempLink;
|
|
|
|
|
VP_TempLink =VP_TempLink->GetNextPtr();
|
|
|
|
|
}/*
|
|
|
|
|
///////////////////////*/
|
|
|
|
|
|
|
|
|
|
if(AB_IsAscending==true)
|
|
|
|
|
QuickSortAsc (VPP_LinkPtrArr, 0, VL_SortSize-1);
|
|
|
|
|
else QuickSortDesc(VPP_LinkPtrArr, 0, VL_SortSize-1);
|
|
|
|
|
|
|
|
|
|
for(i=1; i<VL_SortSize; ++i) // VL_SortSize-1 <20><> <20><>ȯ
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]);
|
|
|
|
|
}/*
|
|
|
|
|
//////////////////////////*/
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(VP_PrevHead /*##########*/ , VPP_LinkPtrArr[0]);
|
|
|
|
|
ZCLink::JoinLink(VPP_LinkPtrArr[VL_SortSize-1], VP_NextTail );
|
|
|
|
|
|
|
|
|
|
if(AL_HeadPos==1)
|
|
|
|
|
ARR_CObjList.mp_HeadLink=VPP_LinkPtrArr[0];
|
|
|
|
|
|
|
|
|
|
delete[] VPP_LinkPtrArr; //////////////////////
|
|
|
|
|
}/*
|
|
|
|
|
static void QuickSortPart ############################
|
|
|
|
|
(
|
|
|
|
|
TTypObjList& ARR_CObjList,
|
|
|
|
|
ZCLink* AP_HeadLink ,
|
|
|
|
|
TypeSize AL_HeadPos ,
|
|
|
|
|
ZCLink* AP_TailLink ,
|
|
|
|
|
TypeSize AL_TailPos ,
|
|
|
|
|
bool AB_IsAscending=true
|
|
|
|
|
)
|
|
|
|
|
/*##################################################*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void MergeSort
|
|
|
|
|
(TTypObjList& ARR_AddList, TTypObjList& ARR_CutList, bool AB_IsAscending=true)
|
|
|
|
|
/*#################*/
|
|
|
|
|
{
|
|
|
|
|
/*/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ḯ<EFBFBD><EFBFBD>Ʈ ARR_AddList <EFBFBD><EFBFBD> ARR_CutList <EFBFBD><EFBFBD> <EFBFBD>̹<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ĵǾ<EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǽ<EFBFBD><EFBFBD>Ѵ<EFBFBD>. ARR_CutList <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ARR_AddList <EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ARR_AddList <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ĵǾ<EFBFBD>
|
|
|
|
|
<EFBFBD>ִٸ<EFBFBD> ARR_CutList <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ĵǾ<EFBFBD> <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϰ<EFBFBD>, AB_IsAscending <EFBFBD><EFBFBD>
|
|
|
|
|
true <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
|
|
if( &ARR_AddList==&ARR_CutList ||
|
|
|
|
|
ARR_AddList.mp_HeadLink==0 ||
|
|
|
|
|
ARR_CutList.mp_HeadLink==0 ) return ;
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><>¥<EFBFBD><C2A5> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD>,
|
|
|
|
|
<EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȴ<EFBFBD>. */
|
|
|
|
|
|
|
|
|
|
ARR_AddList.OnDelete( ARR_AddList.mp_HeadLink, 1,
|
|
|
|
|
ARR_AddList.mp_HeadLink->mp_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; // <20>̶<EFBFBD><CCB6><EFBFBD> <20><> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
}/*
|
|
|
|
|
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 <20><> <20><>ġ
|
|
|
|
|
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 <20>տ<EFBFBD> <20><>ũ<EFBFBD><C5A9> <20>ϳ<EFBFBD> <20><><EFBFBD>ԵǾ<D4B5><C7BE><EFBFBD><EFBFBD>Ƿ<EFBFBD>,
|
|
|
|
|
VP_LhsTemp <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>. */
|
|
|
|
|
|
|
|
|
|
++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<typename TFunctor> void MakeUnique( /*############*/
|
|
|
|
|
TTypObjList& ARR_CObjList ,
|
|
|
|
|
TFunctor AR_Functor ,
|
|
|
|
|
bool AB_IsSorted =false,
|
|
|
|
|
bool AB_IsAscending=true
|
|
|
|
|
/*#########*/ ) /*#########################################*/
|
|
|
|
|
{
|
|
|
|
|
// ARR_CObjList <20><> <20><> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
|
|
|
|
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 <20><> <20><>ȯ<EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ұ<EFBFBD> <20>̿<EFBFBD><CCBF>Ѵٸ<D1B4>
|
|
|
|
|
<EFBFBD>յ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>忡 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϰ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. */
|
|
|
|
|
|
|
|
|
|
for(TypeSize i=1; i<VL_LoopSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
if(VP_HeadLink->GetData()==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<VL_LoopSize; ++i)*/
|
|
|
|
|
}/*
|
|
|
|
|
template<typename TFunctor> 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 <20><> <20><> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
|
|
|
|
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 <20><> <20><>ȯ<EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ұ<EFBFBD> <20>̿<EFBFBD><CCBF>Ѵٸ<D1B4>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>带 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
*/
|
|
|
|
|
for(TypeSize i=1; i<VL_LoopSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
if(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<VL_LoopSize; ++i)*/
|
|
|
|
|
}/*
|
|
|
|
|
static void MakeUnique( #####################################
|
|
|
|
|
TTypObjList& ARR_CObjList ,
|
|
|
|
|
bool AB_IsSorted =false,
|
|
|
|
|
bool AB_IsAscending=true
|
|
|
|
|
############# ) ###########################################*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<typename TFunctor> static void SplitGroup( /*#####*/
|
|
|
|
|
TTypObjList& ARR_CObjList ,
|
|
|
|
|
TFunctor AR_Functor ,
|
|
|
|
|
bool AB_IsSorted =false,
|
|
|
|
|
bool AB_IsAscending=true
|
|
|
|
|
/*#########*/ ) /*#########################################*/
|
|
|
|
|
{
|
|
|
|
|
/* ARR_CObjList <20><> <20><> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD> <20>ͳ<EFBFBD><CDB3><EFBFBD> <20><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> AR_Functor <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
*/
|
|
|
|
|
if(ARR_CObjList.IsEmpty()) return;
|
|
|
|
|
|
|
|
|
|
if(AB_IsSorted==false)
|
|
|
|
|
{
|
|
|
|
|
QuickSort(ARR_CObjList, AB_IsAscending); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǾ<C8B5><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>...
|
|
|
|
|
}/*
|
|
|
|
|
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 <20><> <20><>ȯ
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
{
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> functor <EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ѱ<EFBFBD><EFBFBD><EFBFBD>. functor <EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD>Ѱܹ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD>) <EFBFBD>Ѵ<EFBFBD>. CutLink()
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ִµ<EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڷᰡ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ȵDZ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. */
|
|
|
|
|
|
|
|
|
|
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<typename TFunctor> static void SplitGroup( ##########
|
|
|
|
|
TTypObjList& ARR_CObjList ,
|
|
|
|
|
TFunctor AR_Functor ,
|
|
|
|
|
bool AB_IsSorted=false ,
|
|
|
|
|
bool AB_IsAscending=true
|
|
|
|
|
############# ) ############################################*/
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
};/*
|
|
|
|
|
template<typename TTypObjList> class ZtCSortObjList */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ܹ<EFBFBD><DCB9><EFBFBD> <20><><EFBFBD>Ḯ<EFBFBD><E1B8AE>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|
|
|
|
|
|
|
|
|
template<typename TTypObjList> 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
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
static void QuickSort
|
|
|
|
|
(
|
|
|
|
|
TTypFuncIsMore APF_IsMore ,
|
|
|
|
|
TTypFuncIsLess APF_IsLess ,
|
|
|
|
|
ZCLink* APA_LinkPtrArr[],
|
|
|
|
|
TypeSize AL_FirstIndex ,
|
|
|
|
|
TypeSize AL_LastIndex
|
|
|
|
|
)
|
|
|
|
|
/*##################################################*/
|
|
|
|
|
{
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)
|
|
|
|
|
{
|
|
|
|
|
TypeSize i=AL_FirstIndex ;
|
|
|
|
|
TypeSize j=AL_LastIndex+1 ;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i];
|
|
|
|
|
|
|
|
|
|
do //////
|
|
|
|
|
{
|
|
|
|
|
while(AL_LastIndex >i && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData()));
|
|
|
|
|
while(AL_FirstIndex<j && APF_IsMore(APA_LinkPtrArr[--j]->GetData(), VP_PivotLinkPtr->GetData()));
|
|
|
|
|
|
|
|
|
|
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
|
|
|
|
|
}
|
|
|
|
|
while(i<j);
|
|
|
|
|
|
|
|
|
|
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex],APA_LinkPtrArr[j]);
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD> <EFBFBD>ڵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ʒ<EFBFBD>ó<EFBFBD><EFBFBD> 2 <EFBFBD>ٷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD>ʾƼ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
*/
|
|
|
|
|
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j];
|
|
|
|
|
APA_LinkPtrArr[j ]=VP_PivotLinkPtr ;
|
|
|
|
|
|
|
|
|
|
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, AL_FirstIndex, j-1 );
|
|
|
|
|
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, j+1, AL_LastIndex);
|
|
|
|
|
}/*
|
|
|
|
|
if(AL_FirstIndex<AL_LastIndex)*/
|
|
|
|
|
}/*
|
|
|
|
|
template
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
static void QuickSort
|
|
|
|
|
(
|
|
|
|
|
TTypFuncIsMore APF_IsMore ,
|
|
|
|
|
TTypFuncIsLess APF_IsLess ,
|
|
|
|
|
ZCLink* APA_LinkPtrArr[],
|
|
|
|
|
TypeSize AL_FirstIndex ,
|
|
|
|
|
TypeSize AL_LastIndex
|
|
|
|
|
)
|
|
|
|
|
/*##################################################*/
|
|
|
|
|
|
|
|
|
|
/*private:*/
|
|
|
|
|
public :
|
|
|
|
|
|
|
|
|
|
template
|
|
|
|
|
<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
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(; i<VL_SortSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
VPP_LinkPtrArr[i]=VP_TempLink ;
|
|
|
|
|
VP_TempLink =VP_TempLink->GetNextPtr();
|
|
|
|
|
}
|
|
|
|
|
/////////////////////////
|
|
|
|
|
|
|
|
|
|
QuickSort(APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1);
|
|
|
|
|
|
|
|
|
|
for(i=1; i<VL_SortSize; ++i) // VL_SortSize-1 <20><> <20><>ȯ
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]);
|
|
|
|
|
}
|
|
|
|
|
////////////////////////////
|
|
|
|
|
|
|
|
|
|
#if(_CODE_OLD_) // <20>Ʒ<EFBFBD> <20>ڵ常 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
ZCLink::MakeCircle(VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]);
|
|
|
|
|
#else
|
|
|
|
|
ARR_CObjList.mp_HeadLink=VPP_LinkPtrArr[0] ;
|
|
|
|
|
ARR_CObjList.mp_TailLink=VPP_LinkPtrArr[VL_SortSize-1];
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
delete[] VPP_LinkPtrArr;
|
|
|
|
|
}/*
|
|
|
|
|
template<typename TTypFuncIsMore, typename TTypFuncIsLess>
|
|
|
|
|
static void QuickSort(TTypObjList& ARR_CObjList, TTypFuncIsMore APF_IsMore, TTypFuncIsLess APF_IsLess) */
|
|
|
|
|
|
|
|
|
|
public:
|
2021-02-26 17:21:25 +09:00
|
|
|
|
};/*
|
2025-08-17 02:48:15 +09:00
|
|
|
|
template<typename TTypObjList> class ZtCSortSimList */
|
2021-02-26 17:21:25 +09:00
|
|
|
|
|
|
|
|
|
}/*
|
|
|
|
|
namespace ZNsMain*/
|
2025-08-17 02:48:15 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif //__ZCPPMAIN__ZCSORT_LIST_H__
|