归并排序的思想
归并排序的核心思想是分治,我们需要将一个完整的数组先进行拆分,随后合并,合并的过程其实就是交换索引内容的过程,该过程中可以找到很多逆序对,在解决逆序对问题时可以考虑归并排序。
public class 归并排序{
static int N=10001;
static int n;
static int num[]=new int[N];
static int b[]=new int[N];
static void Merge(int l,int mid,int r){
int t=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(num[i]>num[j]){//改条件符合逆序对问题的条件
b[t++]=num[j++];
cnt+=mid-i+1;//在这里cnt表示的是逆序对的数目,因为左右半边分别排好了序(升序),如果左半边有一个数字大于右半边的数字,那么左半边剩余的数字一定也符合逆序对的条件,所以cnt+=mid-i+1;
}else{
b[t++]=num[i++];
}
}
while(i<=mid) b[t++]=num[i++];
while(j<=r) b[t++]=num[j++];
for(int i=0;i<t;i++) num[l+i]=b[i];
}
static void MergeSort(int l,int r){
if(l<r){
int mid=l+r>>1;
MergeSort(l,mid);
MergeSort(mid+1,r);
Merge(l,mid,r);
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int num[]=new int[N];
n=sc.nextInt();
for(int i=0;i<n;i++)num[i]=sc.nextInt();
MergeSort(0,n-1);
}
}