1 3 4 2 5,每个数左侧比自己小的数字累加,最后全部加起来。
用归并算法:
转化成每个数的右侧有几个比自己大的数,自己就加几次
134,25
13,4 2,5
1,3 4 2 5
public static int smallsum(int[] arr){
if(arr==null||arr.length<2) {return 0;}
return process(arr,0,arr.length-1);
}
public static int process(int[] arr,int l,int r){
if(l==r) {return 0;}
int mid=l+((r-l)>>1);
return process(arr,l,mid)+process(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]?arr[p1]*(r-p2+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;
}
快速排序
设置两个未知变量,一个指向比num小的数最右边的下标,另一个数字遍历
随机选取一个下标,时间复杂度:O(N*logN)