分治-归并排序

动画演示地址

https://visualgo.net/zh/sorting

数组排序任务可以如下完成:
1)把前一半排序
2)把后一半排序
3)把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成

用分支解决归并排序

#include 
using namespace std;

void Merge(int a[],int s,int m,int e,int tmp[])
{//将数组a的局部a[s,m]和a[m+1,e]合并到tmp,并保证tmp有序,然后再拷贝回a[s,m]
 //归并操作时间复杂度: O(e-m+1)即O(n)
    int pb = 0;
    int p1 = s,p2 = m+1;
    while(p1<=m && p2<=e){
        if(a[p1] < a[p2])
            //p1++是将值赋给之后,要指向下一个元素
            tmp[pb++] = a[p1++];
        else
            tmp[pb++] = a[p2++];
    }
    //当两个数组比较完之后,可能其中一个数组元素比另一个多,再把多的赋给tmp[]
    while(p1<=m)
        tmp[pb++] = a[p1++];
    while(p2<=e)
        tmp[pb++] = a[p2++];
    //最后再把tmp[]中元素复制给a[],tmp[]在这个过程中作中转
    //为何是e-s+1,因为s,e不一定是开头或者末尾,如果是的话可以i
分治-归并排序_第1张图片
分治-归并排序_第2张图片

时间复杂度

分治-归并排序_第3张图片

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