归并排序

归并排序分成三个步骤

  • 将两个有序数组合并为一个有序数组
  • 将二维数组的元素压缩为一半
  • 构造归并排序方法

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值