归并排序算法与求逆序对思路及Java实现

1.归并排序算法思路

《归并排序算法与求逆序对思路及Java实现》

《归并排序算法与求逆序对思路及Java实现》

首先我们要清楚,归并排序算法采用了分治法的思想,即将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。归并排序首先将排序分成两部分,接着再将这两部分分解成更小的两部分,直到分解到只剩一个元素为止。

2.归并排序伪代码实现

《归并排序算法与求逆序对思路及Java实现》

《归并排序算法与求逆序对思路及Java实现》

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);
    	}
    }
}

 

点赞