归并排序模板&求逆序对模板

归并排序大家都会写,分治->选择较小值->移过去->搬回来。

在这里插入图片描述
注意一下最后一步,就是把tmp从0开始搬到arr中它该在的位置(也就是从l到r)
然后求逆序对我想不通了~ /(ㄒoㄒ)/~~
为什么要加两次啊!那不就重复了吗!
在这里插入图片描述
先丢个模板——

在这里插入图片描述
不懂就问,然鹅好像大家都没有我这样的问题,好像还有人直接写

merge_sort(arr, l, mid) , merge_sort(arr, mid + 1, r);
cnt += (mid - i + 1);
//然后最后去打印cnt

小数没问题但是大数就会出问题啊!还是要加两边,为什么呢!
来看些个栗子——

在这里插入图片描述
位置发生改变在合并5 6 1这一步,这一步cnt += 2,也就是2
然后arr变成了2 3 4 1 5 6,即将进行最后一步,左序列为2 3 4,右序列为1 5 6,2 3 4都>1所以cnt+=3,也就是5,没毛病!
还不死心,再来看一个例子——

在这里插入图片描述

在这里插入图片描述

为什么不会重复加呢?
因为每一个分支的cnt都是以它以下的分支为基础加起的,而最底层是从0来的,每一次+=都是比较了第二个序列中指针所指元素比第一个序列中指针所指元素小才会+=,就像那个(0,7)中,2贡献了3,3贡献了3,6贡献了3,79贡献了1,这是累加的,而不是直接赋值,最后,每一个结点都需要左右分支相加才是左右分别的逆序对之和,然后再对左右分别有序,整个无序的数组做merge,又是累加的关系,所以继续+=。

在这里插入图片描述
啊!诗乃乃太帅了!然鹅我太菜了!一个归并研究了一上午,但是模板不是光背就行的,还是要搞懂的,不搞懂就背全tmd知识盲区。楼上好吵啊,快点修好吧,孩子顶不住了~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值