归并排序代码实现与分析(C++)

     学习过程跟进《数据结构与算法分析》,主要代码大致与书中例程相同,若有疏漏或错误,请务必提醒我,我会尽力修正。

 归并排序:

    不做特别介绍,其实现的基本思想是朴素的,只是过程的梳理有些复杂(我总觉得是因为递归的操作让代码看起来十分抽象......)。

    以及,与其看代码不如看看大佬的图解。对于排序一整节的内容,我都推荐看图解要胜于看代码。

    这里放一位大佬制作的图解,只要看一张图再对比一些如下代码,基本上能搞明白这个代码的意图:https://www.cnblogs.com/chengxiao/p/6194356.html

void MSort(int *A,int *TmpArray,int Left,int Right)
{
	int Center;
	if (Left < Right)
	{
		Center = (Left + Right) / 2;
		MSort(A, TmpArray, Left, Center);
		MSort(A, TmpArray, Center + 1, Right);
		Merge(A, TmpArray, Left, Center + 1, Right);
	}
}
void Mergesort(int *A,int N)
{
	int* TmpArray;
	try
	{
		TmpArray = new int[N];
		MSort(A, TmpArray, 0, N - 1);
		delete TmpArray;
	}
	catch (const bad_alloc& e)
	{
		exit;
	}
}
void Merge(int A[],int TmpArray[],int Lpos,int Rpos,int RightEnd)
{
	int i, LeftEnd, NumElements, TmpPos;
	LeftEnd = Rpos - 1;
	TmpPos = Lpos;
	NumElements = RightEnd - Lpos + 1;
	while (Lpos<=LeftEnd&&Rpos<=RightEnd)
		if (A[Lpos] <= A[Rpos])
			TmpArray[TmpPos++] = A[Lpos++];
		else
			TmpArray[TmpPos++] = A[Rpos++];
	while (Lpos <= LeftEnd)
			TmpArray[TmpPos++] = A[Lpos++];
	while (Rpos <= RightEnd)
			TmpArray[TmpPos++] = A[Rpos++];
	for (i = 0; i < NumElements; i++, RightEnd--)
			A[RightEnd] = TmpArray[RightEnd];
}

    典型的分治递归排序算法,从结论来说,其运行时间位O(N*logN)。数学算式不太方便写,也写得肯定没有其他大佬清楚,所以还是算了。

猜你喜欢

转载自blog.csdn.net/Tokameine/article/details/113917827