逆序对数量
一直不了解内部分治的调用顺序,因此画图调用
题目:
代码
package 大学菜;
import java.util.Scanner;
public class 逆序对数量 {
static int num= 100010;
static int[] tmp = new int[num];
static long number =0 ;
//pu
public static int sort(int[] A,int l,int r){
//判断
if(l>=r){return 0;}
//先分再治
int middle = l+r >>1;
//治
sort(A,l,middle);
sort(A,middle+1,r);
//
int k=0;
int i=l;
int j = middle+1;
while (i<=middle && j<=r){
if (A[i] <=A[j]) {
tmp[k++] = A[i++];
}else {
number = number+middle-i+1;//对j来说,则mid-i+1是当前j的所有逆序对
tmp[k++] = A[j++];//A[i]>A[j]&&i<j
}
}
while (i<=middle){tmp[k++]= A[i++];}
while (j<=r){tmp[k++] = A[j++];}
//现在只是临时数组
for(int I=l,K=0;I<=r;I++,K++){
A[I] = tmp[K];
}
return (int) number;
}
//zhu
public static void main(String[] args) {
//
Scanner sc= new Scanner(System.in);
int N = sc.nextInt();
int[] A = new int[N];
for(int i= 0;i<N;i++){
A[i] = sc.nextInt();
}
int m = sort(A,0,N-1);
System.out.println(m);
}
}
内部的调用过程
例如说
A = [5,4 ,3,2,1]
sz2wqMerge(0,4)->Merge(0,2)->Merge(0,1)-Merge(0,0) 满足条件
return Merge(0,1)–》Merge(1,1)
满足条件
return执行Merge(0,1)接下来的代码-计算出number 1
return Merge(0,2)->Merge(2,2)满足条件
return Merge(0,2)执行下面的代码,计算出number 1+2
return Merge(0,4) ->Merge(3,4)->Merge(3,3)->Merge(4,4)
return Merge(3,4)->执行下面的代码计算出number 1+2 +1
return Merge(0,4)->执行下面的代码 计算出number 1+2+1+6
每次都是执行到最小子空间后返回,分解成两个有序的空间再进行计算。