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

排序算法——归并排序

时间:2019-03-24 23:22:01      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:序列   行合并   else   color   int   描述   src   str   amp   

算法思想

归并排序的主要思想就是将一个待排序列,①不断地一分为二划分成一个元素组成序列,一个元素组成的序列也就是有序序列,②然后再合并将相邻的两个有序序列,最终待排序列变成一个有序序列。
总之,归并算法就是采用了分治+递归的思想,先递归分解数列,然后再合并数列

算法演示

以待排序列3,2,5,6,4,7,1为例

将此序列一分为二

①:3,2,56,4,7,1
然后将①左边序列3,2,5一分为二

②:3 和 2,5
继续划分②左边序列,因为只有一个元素3,所以3已经是有序序列,返回到②将右边序列一分为二

③:2 和 5

因为③的左边和右边序列均只有一个元素所以都是有序序列,就可以进行左右相邻序列的合并操作,此时合并后的序列为2,5。然后,返回到②合并序列32,5为有序序列2,3,5

然后返回到①,将①右边的序列一分为二

④:6,4 和 7,1

将④的左边继续一分为二

⑤:6 和 4

因为⑤的左右两边序列均为一个元素,也就是都是有序的,那么就将这两个相邻序列进行合并,合并后的序列为4,6,返回到④,将④右边的序列进行一分为二

⑥:7 和 1

因为⑥的左右两边序列均为一个元素,所以都是有序序列,将这两个序列合并,合并后为1,7
然后回到④,合并④的左右两边有序序列4,61,7,合并后为1,4,6,7

最后回到①,现在①的左右两边均为有序序列,2,3,5 1,4,6,7,合并这两个序列,合并后就为1,2,3,4,5,6,7?

对应上述文字分析,附图一张,可对照理解
技术图片

算法代码实现

根据描述,将代码实现就可分为以下两部分:

递归分解序列

//要重新开辟空间存储排好序的数据
bool MergeSort(int a[],int n)
{
    int * temp = new int[n];
    if(NULL == temp)
        return false;
    mergesort(a,0,n-1,temp);
    delete[] temp;
    return true;
}

void mergesort(int a[],int first,int last,int temp[])
{
    if(first<last)
    {
        int mid = (first+last)/2;//将一个数组一分为二
        mergesort(a,first,mid,temp);//左边有序
        mergesort(a,mid+1,last,temp);//右边有序
        mergearray(a,first,mid,last,temp);//合并两个数组
    }
}

合并两个有序序列

//将一个数组一分为二看做两个数组,将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[],int first,int mid,int last,int temp[])
{
    int i = first,j = mid+1;
    int n = mid, m = last;
    int k = 0;
    while(i<=n && j<=m)
    {
        if(a[i]<a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while(i <= n)
        temp[k++] = a[i++];
        
    while(j <= m)
        temp[k++] = a[j++];
        
    for(i=0;i<k;i++)//将排好序的值赋给原数组
        a[first+i] = temp[i];
}

排序算法——归并排序

标签:序列   行合并   else   color   int   描述   src   str   amp   

原文地址:https://www.cnblogs.com/myworld7/p/10591122.html

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