归并排序分成三个步骤
- 将两个有序数组合并为一个有序数组
- 将二维数组的元素压缩为一半
- 构造归并排序方法
1、将两个有序数组合并为一个有序数组
public static int[] mergeArr(int[] arr1, int[] arr2)
{
int[] result=new int[arr1.length + arr2.length];
int startArr1 = 0;
int startArr2 = 0;
int insertIndex = 0;
for( ; ; )
{
if(startArr1>arr1.length-1||startArr2>arr2.length-1)
{
break;
}
if(arr1[startArr1]<arr2[startArr2])
{
result[insertIndex]=arr1[startArr1];
startArr1 += 1;
}
else
{
result[insertIndex]=arr2[startArr2];
startArr2 += 1;
}
insertIndex+=1;
}
if(startArr1>arr1.length-1)
{
for(int k=startArr2;k<arr2.length;k++)
{
result[insertIndex]=arr2[k];
insertIndex+=1;
}
}
else
{
for(int k=startArr1;k<arr1.length;k++)
{
result[insertIndex]=arr1[k];
insertIndex+=1;
}
}
return result;
}
2、将二维数组的元素压缩为一半
public static int[][] getHalf(int[][] arr)
{
int[][] result;
if(arr.length%2==1)
{
result = new int[ arr.length / 2 + 1][];
}
else
{
result = new int[ arr.length / 2 ][];
}
for(int i=0;i<result.length;i++)
{
if(i*2+1>=arr.length)
{
result[i] = mergeArr(arr[i*2],new int[] {});
}
else
{
result[i] = mergeArr(arr[i*2],arr[i*2 + 1]);
}
}
return result;
}
3、构造归并排序方法
public static int[] guiBing( int[] arr )
{
int[][] arry = new int[arr.length][1];
for(int i=0;i<arr.length;i++)
{
arry[i]=new int[]{arr[i]};//拆成子数组,每个子数组里面只有一个数,所以只有一个数的数组就是有序数组
}
/**
* 合并有序的子数组,一直到合并到一个为止
*/
//int[][] arrx=arry;
for(;;)
{
if(arry.length>1)
{
arry=getHalf(arry);
}
else
{
break;
}
}
return arry[0];
}
调用归并方法:
public class CalendarTest
{
public static void main(String[] args)
{
int[] arr1={1, 3, 5, 4, -8, -4, 13, 88, 45, 51, -65 };
int[] arrx=FangFa.guiBing(arr1);
for( int i = 0; i < arrx.length; i++) {
System.out.print(arrx[i] + " ");
}
}
输出结果为:
-65 -8 -4 1 3 4 5 13 45 51 88