排序之歸並排序(遞歸)


歸並排序:(MERGE-SORT)是建立在歸並操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為二路歸並

歸並操作(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+" ");  
              }
               
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM