• 回忆下归并


    就不写代码了(写了估计会出问题调试好一会哈哈)

    简述一下归并的过程 

    和快排一样用数组下标来模拟被分割的数组  

    因为是根据二叉树遍历衍生的算法所以我们首先要把数组还原成树

    具体的还原过程:

    1,思想是用下标来模拟数组拆分成树的拆分过程

    2,比如L表示将要拆分的左边界  R表示右边界 M表示L和R的中间值 

      经过这一步操作已经用下标把数组拆成了两段 第一段 左边的 [L,M] 第二段 右边的[M,R]

    3,递归   

     SortFunc(arr,L,R)

    {
        if(L == R)
          return;
        M = (L+R)/2;
        ...
        //先对左子树进行分割   
        SortFunc(arr,L,M);
        //在所有左子树进行完之后对右子树进行分割   
        SortFunc(arr,M+1,R);
        //开始归并  就是把一个节点上左右孩子进行排序  
        Merge(arr,L,R);   
    }

    4,如何归并:

      分割的操作吗 结果就是两端数组

      所以合并就是就是制造两段有序数组进行合并

         两段数组就是 [L,M]和[M+1,R]  给左右数组各添加用于比较值大小的索引 然后通过左右下表的挪动决定值左边数组元素插入到右边数组的位置(不细说了  就是两个有序数组合并成一个有序数组)

     

  • 相关阅读:
    Codeforces 678E 状压DP
    Codeforces 667C DP
    POJ 3017 DP + 单调队列 + 堆
    Codeforces 1154F (DP)
    Codeforces 1154G 枚举
    Codeforces 1153D 树形DP
    Codeforces 1109E 线段树
    Codeforces 1109C 线段树
    Codeforces 1109D (树的计数问题)
    async/await
  • 原文地址:https://www.cnblogs.com/chenggg/p/11185004.html
Copyright © 2020-2023  润新知