排序-歸併排序
阿新 • • 發佈:2018-12-30
問題:給指定n個數排序(歸併排序)
思路:
歸-遞迴,並-合併;對長度為n的數遞迴拆分,然後在每次遞迴中合併排序;
code:
public class MergerSort { public static void main(String[] args) { Scanner as=new Scanner(System.in); int i,n; n=as.nextInt(); int a[]=new int[n]; for(i=0;i<n;i++) a[i]=as.nextInt(); if(n>2) { merge(a,0,n-1); } for(i=0;i<n;i++) System.out.print(a[i]+" "); } private static void merge(int[] a, int i, int j) { if(i==j) { return; }else { int m=i+(j-i)/2; merge(a,i,m); merge(a,m+1,j); toOne(a,i,m,j); } } private static void toOne(int[] a, int i, int m, int j) { int s[]=new int[j-i+1]; int x=i,y=m+1,k=0; while(x<=m&&y<=j&&k<j-i+1) { if(a[x]>a[y]) { s[k]=a[y]; y++;k++; }else { s[k]=a[x]; x++;k++; } } if(x>m) { while(k<j-i+1&&y<=j) { s[k]=a[y]; y++;k++; } }else { while(k<j-i+1&&x<=m) { s[k]=a[x]; x++;k++; } } for(k=0;k<j-i+1;k++) { a[i+k]=s[k]; } }
解釋:歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。歸併排序是一種穩定的排序方法。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。