歸併排序

https://www.cnblogs.com/chengxiao/p/6194356.html
原理可以看下這位大大的博客,圖片描述的很棒

調用遞歸,第一次講一個數組分成兩部分,然後先對左部分進行操作,再次遞歸劃分最後將其劃分成兩兩一組的小數組,在小數組內比較,變成有序的小數組,然後遞歸返回,開始合併,將幾個有序的小數組併成一個有序的大數組,然後右部分重複上述操作,最後形成兩個有序數組,在進行並。。。

package sort;

public class DArray
{
    private int [] array = { 9 , 5 , 3 , 6 , 7 , 8 , 12 , 33 } ;
    private int size  ;
    private int [] workSpace ;

    public DArray ()
    {
        size = array.length ;
        workSpace = new int [size] ;
    }

    public void sort ()
    {
        merge1 ( workSpace , 0 , size - 1 ) ;

    }

    //將數組細分,最後分成兩兩一組
    public void merge1 ( int [] w , int left , int right )
    {
        if ( left < right )
        {
            int mid = ( left + right ) / 2 ;

            merge1 ( w , left , mid ) ;
            merge1 ( w , mid + 1 , right ) ;
            merge ( w , left , mid , right ) ;
        }

    }

    //組內進行比較,排序,結果是保證組內有序
    public void merge ( int [] w , int left , int mid , int right )
    {
        int l = left ;//左部分開始索引
        int m = mid + 1 ;//右部分開始索引
        int i = 0 ;//臨時數組的索引

        while ( l <= mid && m <= right )
        {
            if ( array [l] < array [m] )
            {
                w [i++] = array [l++] ; 
            }
            else
            {
                w [i++] = array [m++] ;
            }
        }

        //將剩餘數據導入到臨時數組中
        while ( l <= mid )
        {
            w [i++] = array [l++] ;
        }

        while ( m <= right )
        {
            w [i++] = array [m++] ;
        }

        //將臨時數組中數組導入到原數組中,完成排序
        i = 0 ;
        while ( left <= right )
        {
            array [left++] = w [i++] ; 
        }

    }

    //遍歷
    public void display ()
    {
        for ( int i = 0 ; i < size ; i ++)
        {
            System.out.print ( array [i] + " " );
        }
    }
}
發佈了43 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章