小和问题 逆序对问题c++

小和问题是指在一个数组中,如果右边的数比左边的数大,那么这样的组合构成小和。例如,数组1 3 5 6 7的小和为1+1+3+1+3+5+1+3+5+6。可以利用归并排序的思路来解决,通过比较在归并过程中的左右两个数,统计小和。逆序对问题与此类似,但记录的是左边数字比右边数字大的情况。在归并过程中,只需计算左边数组比右边数字大的个数即可。
摘要由CSDN通过智能技术生成

问题描述:如果一个数组中,右边的数比左边数字大,则构成小和
例:1 3 5 6 7中 1<3 1
1<5 3<5 1 3
1<6 3<6 5<6 1 3 5
1<7 3<7 5<7 6<7 1 3 5 6小和为:1+1+3+1+3+5+1+3+5+6
利用归并排序
(转他人)分析
在归并过程中计算小和,实质是如果左数小于右数,则记录
1 3 4|2 5
/
1 3 |4 2|5
/
1|3
1.在1|3归并中,1<3,产生小和1;
2.在1 3|4归并中,p1指向1,p2指向4。1<4,记录小和1,p1指向3,3<4,继续记录小和3;
3.右侧2|5,2<5,记录小和2;
4.1 3 4 | 2 5中,p1指向1,p2指向2。1<2,则2右侧大于2的数都构成小和,记录小和2个1;
p1移到3处,3>2不记录,p2右移到5,3<5,由于5右侧没有数了,所以记录小和1个3;p1继续右移,4<5,再继续记录小和1个4;
5.小和 = 1+1+3+2+21+13+1*4 = 16

int  merge(int a[], int l, int m, int r)
{
   
	int help[100];
	int i = 0;
	int p1 = l;
	int p2 = m + 1;
	int res = 0;
	while (p1<=m&&p2<=r)
	{
   
		res +
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值