1,递归
public void mergeSort(int[] arr){
if(arr==null || arr.length<2) return;
sort1(arr,0,arr.length-1);
}
public void sort1(int[] arr,int l,int r){
if(l>=r) return;
int mid=l+((r-l)>>1);
sort1(arr,l,mid);
sort1(arr,mid+1,r);
merge(arr,l,mid,r);
}
public void merge(int[] arr,int l,int mid,int r){
int[] tmp=new int[r-l+1];
int i=0;
int p1=l,p2=mid+1;
while(p1<=mid&&p2<=r){
tmp[i++]= arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=mid){
tmp[i++]=arr[p1++];
}
while (p2<=r)
tmp[i++]=arr[p2++];
i=0;
while(l<=r){
arr[l++]=tmp[i++];
}
}
2.非递归
public void mergeSort2(int[] arr){
if(arr.length<2 || arr==null) return;
int n=arr.length;
int size=1;
while(size<n){
int l=0;
while(l<n){
int m=l+size-1;
if(m>=n) break;
int r=Math.min(n-1,m+size);
merge(arr,l,m,r);
l=r+1;
}
if(size>n/2)
break;
size<<=1;
}
}
3.例题
@Test
public void test01(){
int[] arr={1,3,4,2,5};
System.out.println(sum(arr));
}
public int sum(int[] arr){
if(arr==null||arr.length<2)
return 0;
return sort(arr,0,arr.length-1);
}
public int sort(int[] arr,int l,int r){
if (l>=r) return 0;
int mid=l+((r-l)>>1);
int left=sort(arr,l,mid);
int right=sort(arr,mid+1,r);
int merge=merge(arr,l,mid,r);
return left+right+merge;
}
public int merge(int[] arr,int l,int mid,int r){
int[] tmp=new int[r-l+1];
int i=0,res=0;
int p1=l,p2=mid+1;
while(p1<=mid&&p2<=r){
res+=arr[p1]<arr[p2]?arr[p1]*(r-p2+1):0;
tmp[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=mid){
tmp[i++]=arr[p1++];
}
while(p2<=r)
tmp[i++]=arr[p2++];
i=0;
while(l<r)
arr[l++]=tmp[i++];
return res;
}