归并排序

1、概念

归并排序(Merging Sort):将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

2、算法实现

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置;

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

重复步骤3直到某一指针达到序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

3、code

/*将SR[s…t]归并排序为TR1[s…t]*/
void MSort(int SR[],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…m]和SR[m+1…t]*/
        MSort(SR,TR2,s,m);
        MSort(SR,TR2,m+1,t);
        Merge(TR2,TR1,s,m,t);    /*将TR2[s…m]和TR2[m+1…t]归并到TR1[s…t]*/
    }
}

/*将有序的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)    /*说明SR[i…m]没有完全归并到TR而SR[m+1…n]已经全部归并到SR*/
    {
        for(l=0;l<=m-i;l++)
            TR[k+1]=SR[i+1];    /*将剩余的SR[i…m]复制到TR*/
    }
    if(j<=n)    /*说明SR[m+1…n]没有完全归并到TR而SR[i…m]已经全部归并到SR*/
    {
        for(l=0;l<=n-j;l++)
            TR[k+1]=SR[j+1];    /*将剩余的SR[m+1…n]复制到TR*/
    }
}

你可能感兴趣的:(归并排序)