问题描述:求一个数组中第i位元素左边比它小的元素的个数,i从0-n。
题解:
考虑到归并排序的特性,和求逆序对相反,从小往大排。
直接上代码了。
import java.util.Scanner;
public class smallsum {
public static int mergeSort(int[] arr,int l,int r) {
if(l==r)
return 0;
int mid = (l+r)/2;
return mergeSort(arr,l,mid)+mergeSort(arr,mid+1,r)+merge(arr,l,mid,r);
}
public static int merge(int[] arr,int l,int mid,int r) {
int[] help = new int[r-l+1];
int ans = 0;
int i=0;
int p1 = l;
int p2 = mid+1;
while(p1<=mid&&p2<=r) {
if(arr[p2]>arr[p1])
ans += (r-p2+1)*arr[p1];
help[i++] = arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=mid)
help[i++] = arr[p1++];
while(p2<=r)
help[i++] = arr[p2++];
for(i=0;i<help.length;i++)
arr[l+i] = help[i];
return ans;
}
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int size = 3;
int[] a = new int[size];
for(int i=0;i<size;i++)
a[i] = in.nextInt();
int ans;
ans = mergeSort(a,0,size-1);
System.out.println(ans);
}
}