学习过程跟进《数据结构与算法分析》,主要代码大致与书中例程相同,若有疏漏或错误,请务必提醒我,我会尽力修正。
归并排序:
不做特别介绍,其实现的基本思想是朴素的,只是过程的梳理有些复杂(我总觉得是因为递归的操作让代码看起来十分抽象......)。
以及,与其看代码不如看看大佬的图解。对于排序一整节的内容,我都推荐看图解要胜于看代码。
这里放一位大佬制作的图解,只要看一张图再对比一些如下代码,基本上能搞明白这个代码的意图: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)。数学算式不太方便写,也写得肯定没有其他大佬清楚,所以还是算了。