归并排序解决小和问题和逆序对问题
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;
以上是关于归并排序解决小和问题和逆序对问题的主要内容,如果未能解决你的问题,请参考以下文章