排序——合并(归并)排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序——合并(归并)排序相关的知识,希望对你有一定的参考价值。

原理图:

技术分享

实现代码:

#define MAX 1000

//合并区间a[left,middel]和a[middle+1,right]
void Merge(int a[],int left,int middle,int right)
{
    int pleft=left;  //给左右区间分别加上游标
    int pright=middle+1;
    int b[MAX];
    int pb=0;
    while(pleft<=middle && pright<=right)//任何一个区间全部合并,结束循环
    {
        if(a[pleft]<=a[pright])
        {
            b[pb++] = a[pleft++]; //将a[pright]添加到数组b,并移动pright至下一个位置
        }
        else  //a[pleft] > a[pright]
        {
            b[pb++] = a[pright++];
        }
    }
    while(pleft<=middle)
    {
        b[pb++] = a[pleft++];
    }
    while(pright<=right)
    {
        b[pb++] = a[pright++];
    }

    //再将合并成的数组b重新拷回给a
    int i,j;
    for(i=0,j=left;i<pb;i++,j++)
    {
        a[j] = b[i];
    }
}

//将数组a[left,right]分成两个区间分别排序,然后合并
void MergeSort(int a[],int left,int right)
{
    int middle;
    if(left<right) //如果当前子区间只有一个元素就不再继续划分子区间了,这时MergeSort()会被跳过,直接执行Merge合并
    {
        middle = (left+right)/2;
        MergeSort(a,left,middle); //对左区间进行排序
        MergeSort(a,middle+1,right);  //对右区间进行排序
        Merge(a,left,middle,right);  //合并线性表的原理,合并两个有序的区间
    }
}

以上是关于排序——合并(归并)排序的主要内容,如果未能解决你的问题,请参考以下文章

二路归并排序(也叫合并排序)

排序算法归并排序

归并排序

排序算法之归并排序

分治算法的完美使用----归并排序

归并排序