栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

深入理解归并排序之求小和问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入理解归并排序之求小和问题

在一个数组中,将比当前元素小的当前元素左侧元素累加所求的和成为这个数组的小和。

对小和的求解,我们首先想到的可能是利用遍历的方式将当前元素左侧的元素全部遍历并与当前元素进行比较,然后依次相加得到最终的结果,这个方法也的确可以求出正确的结果,但是时间复杂度相对而言较高,所以我们在这里利用归并排序的方式进行操作。

求左侧有多少元素比当前元素小,我们可以转换为求右侧有多少元素比当前元素大 ,这样就说明对当前元素在计算小和的时候出现的次数。

这里需要注意一个点就是当左右两侧的数据相等的时候,我们需要将右侧的数据先放入到归并排序中创建的新数组里面 这样能更好的确定右侧有多少个数值比左侧的数值大,也就确定了当前元素需要进行累加的次数。

Java代码如下:

package algorithm.sort.sum;



public class SmallSum {
    public static void main(String[] args) {

        int [] arr=new int[]{2,5,3,6,7};
        System.out.println(process(arr, 0, arr.length - 1));


    }

    public static int  process(int []arr,int L, int R){
        int M=L+((R-L)>>1);
        if(L==R){
            return 0;           //设置递归的停止条件
        }
        return process(arr, 1,M)+                     //将左侧的数据进行有序化
        process(arr,M+1,R)+
        merge(arr,1,M,R  ) ;                                    //将右侧的数据进行有序化
    }
    public static int merge(int [] arr,int l,int m,int r ){
        int res=0;
        int i=0;
        int []  elements=new int[r-l+1];
        int x=l;
        int y=m+1;

        while(x 

利用归并排序来进行求小和运算实现算法的相关优化。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292977.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号