排序之歸併排序(遞歸)

歸併排序:(MERGE-SORT)是創建在歸併操做上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併java

歸併操做(merge),也叫歸併算法,指的是將兩個順序序列合併成一個順序序列的方法。
如 設有數列{6,202,100,301,38,8,1}
初始狀態:6,202,100,301,38,8,1
第一次歸併後:{6,202},{100,301},{8,38},{1},比較次數:3;
第二次歸併後:{6,100,202,301},{1,8,38},比較次數:4;
第三次歸併後:{1,6,8,38,100,202,301},比較次數:4;
總的比較次數爲:3+4+4=11;
逆序數爲14;
遞歸思路:設置 mid參數,將歸併排序分紅左右兩部分來作
 借用已經寫好的歸併排序算法,將mid左右兩部分分別排序,
設置遞歸的出口爲first =last,這樣便達到遞歸的效果了。
遞歸的過程:

測試代碼:算法

public class Myguibing {
//排序函數
    public static void  merge(int[]a,int first,int mid,int last,int[]x)
    {
        int i=first;
        int m=mid;
        int j=mid+1;
        int n=last;
        int xi=0;//暫時存放數組
        
        while(i<=m&&j<=n)
        {
        if(a[i]<=a[j])
        x[xi++]=a[i++];
        else
            x[xi++]=a[j++];
        }
        while(i<=m)x[xi++]=a[i++];
        while(j<=n)x[xi++]=a[j++];
        
        for(i=0;i<xi;i++) a[first+i]=x[i];
    }
    //遞歸的把數組劃分爲兩個子數組,一直遞歸到數組中只有一個元素
    static void diguisort(int a[],int first,int last,int xi[])
    {
        if(first<last)//設置遞歸出口
        {
            int mid=(first+last)/2;
            diguisort(a,first,mid,xi);//左邊
            diguisort(a,mid+1,last,xi);//右邊
            merge(a,first,mid,last,xi);//調用歸併排序函數,兩個有序數組排序import java.util.Scanner;
        }
    }
      public void sort(int[] a) {  
            int n=a.length;  
            int[] b=new int[n];  
            diguisort(a, 0, n-1, b);  
        }  
    public static void main(String[] args) {
            
             int[] a= {10,9,8,35,6,39,47,3};  
             int[] b= {12,39,83,325,62,392,417,23};  
             Myguibing p1=new Myguibing();  
              p1.sort(a);  
              p1.sort(b);
              System.out.println("輸入數組經排序後爲:");
                for (int i : b)
              {  
                  System.out.print(i+" ");  
              }
               
  }數組

相關文章
相關標籤/搜索