递归的时间复杂度求解公式: master公式
    T(N) = aT(N/b) + O(N^d)
    T(N)代表母问题的规模
    a代表子问题次数
    T(N/b)是子问题的规模
    O(N^d)代表除递归操作外的时间复杂度
    时间复杂度
    1) logb a < d O(N ^ d)
    2) logb a > d O(N ^ logb a)
    3) logb a == d O(N^d
    logN)

    归并排序:
    912. 排序数组
    可以采用多种排序,这里仅仅练习归并排序
    思路:
    1.准备两个函数
    MergeSort 归并排序函数
    Merge 合并函数
    实质:将数组中部分进行排序 并将结果保留下来 用于下一次排序有点避免重复排序的味道了。

    不重复 不遗漏
    不重复是因为 某一个数 算过小和会被合并到同一个数组里
    不遗漏是因为依次往外扩 和右数组合并
    扩展
    小和与逆序对问题
    剑指 Offer 51. 数组中的逆序对
    逆序对与小和是反着来的问题。
    这两者之间区别就在于 一个找 右边比左边大的数 一个找左边比右边大的数
    计算右侧小于当前元素的个数

    327. 区间和的个数 挑战失败

    快速排序:
    荷兰旗题 原型单边循环法 (单区)—-三指针法(双区)—-随机数解决最差情况问题’
    75. 颜色分类 三指针法
    <区 和 = 区 和 >区
    思路:
    通过扩增 < 区 边界 与 >区边界 来将使数组分为 三区
    终止条件 指针 i (用于遍历数组 碰上 >区的右边界
    其实就是 < 区 推着 =区 去和 >区相汇
    或者 >区 推着 =区 去 和 <区相汇
    三种情况
    1.nums[i] < base 归入小于区 nums[i] 与 nums[L + 1] 做交换(与<区下一个交换) 然后归入小于区左边界 扩增(L++),i扩增。
    2.nums[i] > base 归入大于区 nums[i] 与 nums[R - 1] 做交换 (与>区下一个交换)然后归入大于区右边界 扩增(R—),
    i原地不动(原因:此时 nums[i] 与 nums[R - 1] 已做交换,导致nums[i] 尚且未做过判断 不知该归于哪个 区。1的情况下可以i++是因为i从左至右 nums[L + 1]已被检查过。
    3.nums[i] === base
    i++ 直接越过 不处理