归并排序

分解:分解待排序的n个元素序列成各具 n/2 个元素的两个子序列。

解决:使用归并排序递归地排序两个子序列。

合并:合并两个排序的子序列以产生已排序的答案。

      当待排序的序列长度为1时,递归“开始回升”,此时长度为1的每个子序列都已排好序,然后将已排好序的子序列合并。

const int INF=0xfffffff;
void Merge(int a[],int p,int q,int r)//合并排序,a[p,r]由两个有序的子序列组成,将两个子序列合并
{
    int n1=q-p+1;
    int n2=r-q;
    int L[20],R[20];
    for(int i=1; i<=n1; i++)
        L[i]=a[p+i-1];
    for(int i=1; i<=n2; i++)
        R[i]=a[q+i];
    L[n1+1]=INF;
    R[n2+1]=INF;
    for(int k=p,i=1,j=1; k<=r; k++)
    {
        if(L[i]<R[j])
        {
            a[k]=L[i];
            i++;
        }
        else
        {
            a[k]=R[j];
            j++;
        }
    }
}
void MergeSort(int a[],int p,int r)//归并排序算法过程
{
    if(p<r)
    {
        int q=(p+r)/2;
        MergeSort(a,p,q);
        MergeSort(a,q+1,r);
        Merge(a,p,q,r);
    }
}

 

posted @ 2020-09-26 22:11  yanjan  阅读(105)  评论(0)    收藏  举报