1.归并排序算法思路
首先我们要清楚,归并排序算法采用了分治法的思想,即将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。归并排序首先将排序分成两部分,接着再将这两部分分解成更小的两部分,直到分解到只剩一个元素为止。
2.归并排序伪代码实现
3.归并排序及求逆序对代码实现
归并排序可以解决一个求逆序对的问题,即代码中的ORDER_COUNT,在归并排序排序过程中,可以根据换位子的次数来计算逆序对的对数
public class MergeSort {
private static int ORDER_COUNT=0;
public static void main(String[] args){
int[] a=new int[]{9,8,7,6};
MergeSort(a,0,3);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
System.out.println(ORDER_COUNT);
}
public static void Merge(int[] a,int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
int[] L=new int[n1];
int[] R=new int[n2];
for(int i=0;i<n1;i++){
L[i]=a[p+i];
}
for(int j=0;j<n2;j++){
R[j]=a[q+1+j];
}
int m=0,n=0,k=p;
while(m<n1 && n<n2){
if(L[m]<R[n]){
a[k++]=L[m++];
}else{
a[k++]=R[n++];
ORDER_COUNT+=n1-m;
}
}
while(m<n1){
a[k++]=L[m++];
}
while(n<n2){
a[k++]=R[n++];
}
}
public static void MergeSort(int[] a,int p,int r){
if(p<r){
int q=(p+r)/2;
MergeSort(a,p,q);
MergeSort(a,q+1,r);
Merge(a,p,q,r);
}
}
}