Сортировка

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
inlaf
Сообщения: 21
Зарегистрирован: 02 ноя 2009, 12:26

Вроде даработал.
есть ли нарекания по алгоритму сортировки слияниями без копирования ?
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 );
}
Ответить