归并排序--小和问题(逆序对)

本文介绍了如何使用归并排序解决小和问题,即找出数组中左边元素小于右边元素的和。通过在归并过程中判断左右元素大小,累加符合条件的元素。同时,解释了如何在该算法基础上计算逆序对数量,即数组中左侧元素大于右侧元素的对数。
摘要由CSDN通过智能技术生成

引言

    求小和问题:在随机元素,随机数组大小的数组中,找出左边比右边元素小的所有元素之和。

    例如:数组[4,2,5,1,7,3,6] 第一个元素4比2大,不算小和,5比4和2都大,那就是4+2=6;1比4和2和5都小,不算小和;7比前面的都大,那就是上次小和6+4+2+5+1=18;然后3前面比2和1大,那就是18+2+1=21;最后6比4、2、5、1、3都大,结果就是21+4+2+5+1+3=36。那么最后的结果就是36。

    解法:使用归并排序来进行求和,在归并的时候把数组分成左右两个,在归并排序进行左右两个数组进行合并排序的时候进行计算。如果左边数组元素N,小于右边数组元素M,那么从右边数组右指针P到右边数组最后R就有(R-P+1)个N,依次累计相加,最后求出最小和。

      如果要求逆序对,所谓逆序对就是[4,2],[4,1],[5,1].....,  那么就是左边比右边大,那么有多少个逆序对就是,中间位置mid减去左指针下坐标P1+1个逆序对,也就是(mid-P1+1)个逆序对,把逆序对相加进行返回就是共有多少逆序对。

public class MergeSortSum {

	
	public static int mergeSortSum(int[] arr){
		if(null == arr 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值