归并排序模板

1、递归算法的复杂度计算

就是子问题个数 x 解决一个子问题的复杂度。
(即每个子问题的复杂度之和)
在这里插入图片描述
执行的次数是二叉树节点的个数,每次执行的复杂度就是每个节点代表的子数组的长度,所以总的时间复杂度就是整棵树中「数组元素」的个数。

所以从整体上看,这个二叉树的高度是 logN,其中每一层的元素个数就是原数组的长度 N,所以总的时间复杂度就是 O(NlogN)。

2、归并排序模板

 vector<int> tmp;
 void mergeSort(vector<int> &nums, int lo, int hi) {
     if (lo == hi) return;
     int mid = lo + (hi - lo)/2;
     mergeSort(nums, lo, mid);
     mergeSort(nums, mid + 1, hi);
     merge(nums, lo, mid, hi);
 }

 void merge(vector<int> &nums, int lo, int mid, int hi) {
     tmp = nums;
      int i = lo, j = mid + 1;
      // 双指针合并数组
      for (int p = lo; p <= hi; p++) {
         if (i == mid + 1) {
             // 左半边数组已完成合并
             nums[p] = tmp[j++];
         }
         else if (j == hi + 1) {
             // 右半边数组已完成合并
             nums[p] = tmp[i++];
         }
         else if (tmp[i] <= tmp[j]) {
             nums[p] = tmp[i++];
         }
         else {
             nums[p] = tmp[j++];
         }
      }
 }

3、例题

1.327. 区间和的个数
2.493. 翻转对
3.315. 计算右侧小于当前元素的个数
4.912. 排序数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值