算法原理
归并排序基本操作是合并两个已经排序的表。基本的合并算法是取两个输入数组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];}