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] + " " );
}
}
}