1. 程式人生 > >歸併排序演算法與求逆序對思路及Java實現

歸併排序演算法與求逆序對思路及Java實現

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