码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-10-22 21:13:38      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:amp   sort   class   efi   max   http   执行   []   fine   

原理图:

技术分享

实现代码:

#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);  //合并线性表的原理,合并两个有序的区间
    }
}

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

标签:amp   sort   class   efi   max   http   执行   []   fine   

原文地址:http://www.cnblogs.com/wust-owen/p/7710663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!