【归并排序】求小和问题 [java/python]

本文探讨如何利用归并排序解决求小和问题。通过详细解释归并排序的过程,阐述如何在合并过程中计算小于当前元素的和。同时提供Java和Python两种语言的实现,分享了从C/C++到Python的语法转换体会,并邀请读者提供更优雅的Python代码建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

把数列中每个元素左边小于自身的元素加起来

{1, 2, 3},2的左边只有1小于,3左边有1和2小于,加起来的小和值就是4

{
  1,3,5,0,2,4}
1 3 5 | 0 2 4
1 3|5   0 2|4
1|3     0|2 

这个其实是练习归并排序
已知归并过程如下:

  1. 首先划分划分划分,一直划分到不能划分,即每个组都只有一个数值。
  2. 然后合并,合并的过程就是每个二划分排序的过程。
  3. 在合并的时候,开辟一个辅助数组,其大小等于这两个合并数列的大小。
  4. 设置两个指针分别指向每个数列的首部,然后比较得到其中较小的值,并将这个值放入辅助数组中。然后取出小值的那个数列的指针可以继续向前走,与另一个数列的指针所指向的值继续比较
  5. 这样比较完成后,如果两个数列中有个数列的数值有剩余,即其指针没有走到末尾,则将这个数列直接赋到辅助数组末尾即可。
  6. 然后将辅助数组中的值拷贝回原数组中刚才合并的那两个数列的位置上。

其实就是在每次归并排序的时候计算小于的和

count += a[p1] < a[p2] ? (r - p2 + 1)*a[p1] : 0;

java:

import java.io.*;
class test  
{   public static int 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值