归并排序(Merging Sort)就是利用归并的思想实现的排序算法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,...,如此重复,直到得到一个长度为n的有序序列为止。这种排序方法称为2路归并排序。
代码如下:
/* 对顺序表L作归并排序*/
void MergeSort(SqList *L)
{
MSort(L->r, L->r, 1, L->length);
]
其中MSort()函数代码如下:
void MSort(int SR[], int TR1[], int s, int t)
{
int m;
int TR2[MAXSIZE+1];
if(s==t)
TR1[s] = SR[s];
else
{
m= (s+t)/2; //将SR[s..t]平分为SR[s..m]和SR[m+1..t]
MSort(SR, TR2, s,m); //递归将SR[]归并为有序的TR[]
MSort(SR, TR2, m+1,t);
Merge(TR2, TR1, s,m,t);
}
}
MSort()函数的变换示意图如下:
接下来看看Merge()函数的代码实现:
/* 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] */
void Merge(int SR[], int TR[], int i, int m, int n)
{
int j,k,l;
for(j=m+1,k=i; i<=m && j<=n;k++) //将SR中记录由小到大归并入TR
{
if (SR[i]<SR[j])
TR[k] = SR[i++];
else
TR[k] = SR[j++];
}
if (i<m)
{
for(l=0;l<m-i;l++)
TR[k+1] = SR[i+1]; //将剩余的SR[i..m]复制到TR
}
if(j<n)
{
for(l=0;l<n-j;l++)
TR[k+1] = SR[j+1]; //将剩余的SR[j..n]复制到TR
}
}
4.再次循环,k++得到k=2,SR[i]=SR[2]=30, SR[j]=SR[6]=20,SR[i]>SR[j],TR[k]=TR[2]=20,并且j++,如下图所示:
如此循环,归并排序就完成了一次排序工作。归并排序总的时间复杂度为,空间复杂度为
,归并排序是一种占用内存,但稳定高效的排序方法。