ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

归并排序解决小和问题和逆序对问题

2019-10-03 17:57:02  阅读:192  来源: 互联网

标签:mergeSort 归并 p1 int arr mid static 排序 逆序


小和问题:

左边比当前元素小的元素的元素的和

暴力解法不推荐O(N^2)

归并加速

    public static  void  main(String[] args){
        int [] a=new int[]{2, 4, 1, 3, 5};
        System.out.println( smallSum(a));
    }

    public static int smallSum(int[] arr) {
        if (arr == null || arr.length < 2) {
            return 0;
        }
        return mergeSort(arr, 0, arr.length - 1);
    }

    public static int mergeSort(int[] arr, int l, int r) {
        if (l == r) {
            return 0;
        }
        int mid = l + ((r - l) >> 1);
        return mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);
    }

    public static int merge(int[] arr, int l, int m, int r) {
        int[] help = new int[r - l + 1];
        int i = 0;
        int p1 = l;
        int p2 = m + 1;
        int res = 0;
        while (p1 <= m && p2 <= r) {
            //res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;//小和
            res += arr[p1] > arr[p2] ? (m-p1+1)  : 0;//逆序
            help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= m) {
            help[i++] = arr[p1++];
        }
        while (p2 <= r) {
            help[i++] = arr[p2++];
        }
        for (i = 0; i < help.length; i++) {
            arr[l + i] = help[i];
        }
        return res;
    }

 

标签:mergeSort,归并,p1,int,arr,mid,static,排序,逆序
来源: https://www.cnblogs.com/bowenqianngzhibushiwo/p/11620246.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有