数据结构与算法--归并排序

算法原理

归并排序基本操作是合并两个已经排序的表。基本的合并算法是取两个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,它们初始化对应数组的开始端。A[Aptr]和B[Bptr]中的较少者被拷贝到C中的下一个位置,相关的计数器向前推进一步。当两个输入表有一个用完时,则将另一个表中剩余部分拷贝到C中。

算法实例


如果数组A含有1、13、24、26,数组B含有2、15、27、38,那么该算法进行如下:
首先,比较在1和2之间进行,1被加到C中,然后13和2进行比较。

2被添加到C中,然后13和15进行比较。

13被添加到C中,接下来比较24和15,这样一直进行到26和27进行比较。



将26添加到C中,数组A已经用完。

将数组B的其余部分拷贝到C中。

C语言实现

void Msort(ElementType A[],ElementType 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(ElementType A[],int N)
{
	ElementType *TmpArray;
	TmpArray = malloc(N * sizeof(ElementType));
	if(TmpArray != NULL)
	{
		Msort(A,TmpArray,0,N-1);
		free(TmpArray);
	}
	else
		FataError("No space for tmp array!!");
}
void Merge(ElementType A[],ElementType TmpArray[],
			int Lops,int Roos,int RightEnd)
{
	int i,LeftEnd,NumElements,TmpPos;
	LeftEnd = Rpos - 1;
	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 <= RighrEnd)
		TmpArray[TmpPos++] = A[Rpos++];
	for(i = 0;i < NumElements;i++,RightEnd--)
		A[RightEnd] = TmpArray[RightEnd];
}
posted @ 2017-02-26 15:05  梁月唯  阅读(188)  评论(0编辑  收藏  举报