很奇怪,我感觉我的代码没问题,看了别人的代码我还帮他改了bug,结果他跑出来时正确的我的就有问题?
首先上正确的代码
import java.util.Arrays;
public class littlesum {
public static int mergeSortSum(int[] arr){
if(null == arr || arr.length < 2){
return 0;
}
// 排序并返回最小和
return mergeSortSumTest(arr,0,arr.length-1);
}
public static int mergeSortSumTest(int[] arr, int L, int R) {
if(L == R ) {
return 0;
}
int mid = L + (R -L) /2;
// 左边的最小和+右边的最小和+最后排序好的最小和就是最后的结果
return mergeSortSumTest(arr, L, mid) + mergeSortSumTest(arr, mid+1, R) + mergeSortSumArray(arr,L,mid,R);
}
public static int mergeSortSumArray(int[] arr, int l, int mid, int r) {
int[] arrs = new int[r-l+1];
int i = 0;
int p1 = l;
int p2 = mid + 1;
int sum = 0;// 最小和
while(p1<=mid && p2 <= r){
// 如果左边小于右边,那就有(r - p2 + 1)个arr[p1]元素的和是最小和
// 如果大于右边,返回0
sum += arr[p1] < arr[p2]?(r - p2 + 1)*arr[p1]:0;
// sum += arr[p1] > arr[p2]?(mid - p1 + 1):0; //求逆序对
arrs[i++] = arr[p1] < arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=mid){
arrs[i++] = arr[p1++];
}
while(p2<=r){
arrs[i++] = arr[p2++];
}
return sum;
}
public static void main(String[] args){
int[] num={1,3,4,2,5};
System.out.println(mergeSortSum(num));
}
}
然后是我关于这一部分的代码,明明都一样啊,跑出来结果就是不同,首先说一下这是归并排序小和问题
public static int merge(int[] num){
if(num==null||num.length<2){
return 0;
}
return digui(num,0,num.length-1);
}
public static int digui(int[] num,int l, int r){
if(l==r){
return 0;
}
int mid=(l+r)/2;
return digui(num,0,mid)+digui(num,mid+1,r)+guibing(num,mid,l,r);
}
public static int guibing(int[] num,int mid,int l, int r){
int[] help=new int[r-l+1];
int i=0;
int n=0;
int p1=l;
int p2=mid+1;
while(p1<=mid && p2<=r){
n += num[p1]<num[p2]?(r-p2+1)*num[p1]:0;
help[i++]=num[p1]<num[p2]?num[p1++]:num[p2++];
}
while(p1<=mid){
help[i++]=num[p1++];
}
while(p2<=r){
help[i++]=num[p2++];
}
//mmp 一个等于号毁了好几个小时,一定要记住数组的范围。。。。小于数组的长度
for(int j=0;j<help.length;j++){
num[l+j]=help[j];
}
return n;
}