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

Posted bowenqianngzhibushiwo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序解决小和问题和逆序对问题相关的知识,希望对你有一定的参考价值。

小和问题:

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

暴力解法不推荐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;
    

 

以上是关于归并排序解决小和问题和逆序对问题的主要内容,如果未能解决你的问题,请参考以下文章

归并排序应用-------小和问题

小和问题和逆序对问题

归并和快速排序思想的延伸

归并排序:小和问题

归并排序(逆序数问题)详解

归并排序之求小和