歸併排序演算法與求逆序對思路及Java實現
阿新 • • 發佈:2018-12-30
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); } } }