美文网首页
分治-归并排序

分治-归并排序

作者: Co_zy | 来源:发表于2017-10-03 18:56 被阅读0次

动画演示地址

https://visualgo.net/zh/sorting

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

用分支解决归并排序

#include <iostream>
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<e+1;
    for(int i=0;i<e-s+1;++i)
        a[s+i] = tmp[i];
}
//从s开始到e
void MergeSort(int a[],int s, int e,int tmp[])
{
    if(s<e){
        //从中间分开,m代表中间
        int m = s +(e-s)/2; //或者int m = (s+e)/2;
        //a[]数组前一半
        MergeSort(a,s,m,tmp);
        //a[]数组后一半
        MergeSort(a,m+1,e,tmp);
        Merge(a,s,m,e,tmp);
    }
}

int a[10] = {13,27,19,2,8,12,2,8,30,89};
int b[10];

int main()
{

    int size = sizeof(a)/sizeof(int);
    //待排序的起始位置0到size-1,b是临时存储的数组,就是tmp[]
    MergeSort(a,0,size-1,b);
    for(int i=0;i<size;++i)
        cout<<a[i]<<",";
    cout<<endl;
    return 0;
}

时间复杂度

相关文章

  • 数据结构复习笔记 - 排序(下)

    归并排序和快速排序 时间复杂度为 O(nlogn) 归并排序 归并排序使用的就是分治思想。分治,顾名思义,就是分而...

  • 12 基本排序算法:归并排序

    归并排序 原理 归并排序思想 该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(d...

  • python实现归并算法

    归并排序是采用分治法的一个非常典型的应用,另一个可以采用分治法的是快速排序,归并算法比快速排序速度稍低。归并排序的...

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 归并排序&快速排序

    归并排序 利用归并的思想实现排序方法,该算法采用经典的分治策略,分而治之。 代码实现 基础设置 归并排序 —— 非...

  • 数据结构--归并排序与基数排序

    一、归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-a...

  • 算法排序之归并排序和快速排序

    归并排序和快速排序用的都是分治的思想,用递归的编程技巧来实现.咱们先来看归并排序. 归并排序 归并排序的核心思想就...

  • 归并排序(二路归并排序)

    归并排序的思路 归并排序是通过“归并”操作完成排序的,将两个或者多个有序子表归并成一个子表。归并排序是“分治法”的...

  • IOS排序算法之归并排序、快速排序

    归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题。 归并排序 归并排序的核心...

  • 5.归并排序

    5.归并排序 5.1归并排序的思想和复杂度 归并排序思想 归并排序主要是分治法的思想,有自顶向下和自底向上的归并排...

网友评论

      本文标题:分治-归并排序

      本文链接:https://www.haomeiwen.com/subject/juhfyxtx.html