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