/**
*归并排序思路:分治法思想 O(nlogn)
* 把数组一分为二,二分为四
* 四和为二,二和为一
*
*/
/**
* 归并排序主方法
*@params 待排序的数组
*@params 初始位置
*@params 最终位置
*/
public class MergeSort
{
public static void mergeSort(int[] resouceArr, int begin , int end )
{
if ( begin < end )
{
int middle = ( begin + end ) / 2 ;
mergeSort( resouceArr , begin , middle );
mergeSort( resouceArr , middle + 1 , end );
_merge( resouceArr , begin , middle , end );
}
}
/**
*合并两个已经排好序数组的方法
*由mergeSort()调用,定义为private,命名以下划线开头
*/
private static void _merge(int[] arr , int begin , int middle , int end )
{
//获得左数组大小,右数组大小
int leftArrLength = middle - begin + 1 ;
int rightArrLength = end - middle ;
//申请空间
int[] leftArr = new int[leftArrLength + 1];
int[] rightArr = new int[rightArrLength + 1];
//初始化数组的值(把原数组的值一个一个复制quickArr到新数组中)
for( int i = 0 ; i < leftArrLength ; i++)
{
leftArr[i] = arr[begin + i] ;
}
for( int j = 0 ; j < rightArrLength ; j++)
{
rightArr[j] = arr[middle + j + 1] ;
}
//哨兵,放在最后
leftArr[leftArrLength] = 65536 ;
rightArr[rightArrLength] = 65536 ;
int i = 0 ;
int j = 0 ;
for(int k = begin ; k <= end ; k++ )
{
if( leftArr[i] <= rightArr[j] )
{
arr[k] = leftArr[i] ;
i = i + 1 ;
}
else
{
arr[k] = rightArr[j];
j = j + 1 ;
}
}
}
}
归并排序思路
最新推荐文章于 2022-11-08 00:59:43 发布