есть ли нарекания по алгоритму сортировки слияниями без копирования ?
mergesortAB.
Код: Выделить всё
void CmyDoc::mergesortAB(CList<CListItem, CListItem&> &lst)
{
int l(0), i(0);
int r = lst.GetCount();
POSITION pj, pi;
CList<CListItem, CListItem&> &slst = m_slist;
CListItem item;
for(i = l; i<=r-1; i++)
pi = lst.FindIndex(i);
pj = slst.FindIndex(i);
slst.GetAt[pj] = lst.GetAt[pi];
CCNoCopy(pi,pj,l,r);
}
void CmyDoc::CCNoCopy(POSITION p1, POSITION p2, int l, int r)
{
if((r-l) <= 10)
{
SortVstavka(m_list);
return;
}
int m = (l + r)/2;
CCNoCopy(p2, p1, l, m);
CCNoCopy(p2, p1, m+1, r);
CC(p1+l, p2+l, m-l+1, p2+m+1, r-m);
}
void CmyDoc::CC(POSITION p3, POSITION p1, int N, POSITION p2, int M)
{
for(int i(0),j(0),k(0); k < (N+M); k++)
{
if(i == N) {p3 = p2+1; continue;}
if(j == M) {p3 = p1+1; continue;}
p3 = (p1 < p2) ? p1 : p2;
}
}
void CmyDoc::SortVstavka(CList<CListItem, CListItem&> &lst)
{
int q(0);
int r(lst.GetCount());
if (!r) return;
POSITION pmin, pj, pi;
for (int i=r-1; i>q; i--)
{
if(m_Dir)
{
pmin = lst.FindIndex(i);
pj = lst.FindIndex(i-1);
if(lst.GetAt(pj) > lst.GetAt(pmin))
Exch(lst,pj, pmin);
}
else
{
pmin = lst.FindIndex(i);
pj = lst.FindIndex(i-1);
if(lst.GetAt(pj) < lst.GetAt(pmin))
Exch(lst,pj, pmin);
}
}
for (int i=q+2; i<r; ++i)
{
int j = i;
CListItem item;
pi = lst.FindIndex(i);
item = lst.GetAt(pi);
pmin = lst.FindIndex(j);
pj = lst.FindIndex(j-1);
if(m_Dir)
while(item < lst.GetAt(pj))
{
lst.GetAt(pmin)=lst.GetAt(pj); j--;
pmin = lst.FindIndex(j);
pj = lst.FindIndex(j-1);
}
else
while(item > lst.GetAt(pj))
{
lst.GetAt(pmin)=lst.GetAt(pj); j--;
pmin = lst.FindIndex(j);
pj = lst.FindIndex(j-1);
}
lst.GetAt(pmin)=item;
}
UpdateAllViews( NULL );
}