java归并排序实现以及时间复杂度计算

归并排序

大体思路 先二分出左右二侧 左侧排好序 右侧排好序 ,申请一个与原数组相同长度的数组,和二个指针分别指向已排好序的左右数组起点位置index = 0 和index=mid+1
此时 如果左右二侧数组为{2,6,9,3,6,8} 左侧为{2,6,9} 右侧为{3,6,8}

        {2,6,9,3,6,8}
         ↑     ↑
         0     mid+1 
  辅助数组  arrHelp
  当arr[0]>arr[mid+1]的时候 将右侧的arr[mid+1]放入辅助数组中数组中 且mid+1先右移动一位
  当arr[0]<arr[mid+1] 的时候 将左侧的arr[0]放入辅助数组中数组中 且指针为0的指针向右移动一位
  当arr[0]=arr[mid+1] 的时候 将右侧arr[0]放入辅助数组中数组中 移动指针为0的指针向右移动一位
  
  在二分的时候求出单个的也是这个步骤,所以改排序还是稳定排序。

代码实现

public static void process(int[] arr,int L,int R){
1		if(L==R){
2			return;
		}
3		int mid = L+((R-L)>>1);
4		process(arr,L,mid);//f(0,0)
5		process(arr,mid+1,R);//f(1,1)
6		merge(arr,mid,L,R);

	}
	public static void merge(int[] arr ,int mid ,int L,int R){
		int[] arrHelp = new int[R-L+1];
		int i = 0;//操作数组下标
		int leftSilde = L;
		int rightSilde = mid+1;
		//这里是
		while(leftSilde <= mid && rightSilde<=R ){
			arrHelp[i++] = arr[leftSilde] > arr[rightSilde]?arr[rightSilde++]:arr[leftSilde++];
		}
		while(leftSilde<=mid){//当rightSilde已经超过R的时候  则help数组剩下的值全在letfsidel到mid这里 全拷贝
			arrHelp[i++] = arr[leftSilde++];
		}
		while(rightSilde<=R){//同上
			arrHelp[i++] = arr[rightSilde++];
		}
		//当界限全超了的时候则help数组已经包括了需要的值
        for(int j=0;j<arrHelp.length;j++){
			arr[L++]=arrHelp[j];
		}
	}

系统执行流程说明 测试数组:{6,2,5,8}

f(0,3) 记录l =0 ;r = 3 mid = 1 执行到4行
f(0,1) 记录 l =0 ;r = 1 mid = 0 执行到4行
f(0,0) 弹出执行f(1,1) 也弹出 这二个值没球用 只是为了切分
此时的f(0,1)栈中还保留 L=0;R=1 mid=0 传入到merge(arr,mid,L,R);中
int[] arrHelp = new int[R-L+1]; 构建数组arrHelp =new int[2];
且使用上述二个指针移动的操作来摘取小的值优先存入arrhelp数组中,
然后通过 for(int j=0;j<arrHelp.length;j++) 回写到arr原数组中,
执行完毕之后 栈内部还有f(0,3)函数没有执行,l =0 ;r = 3 mid = 1 执行到第4行
然后执行第5行 process(arr,mid+1,R); =f(2,3) 具体执行步骤同上
执行完毕之后 开始执行第6行merge(arr,mid,L,R);

递归主要应用了栈结构,类似于js中的闭包函数

function closen(a){
	return (a)=>{
	  return a;
	}
}
let fn1 = closen(4);
let aguments = fn1();
console.log(aguments)  依然打印出4

时间复杂度的计算
还是master公式
O(T) = 2O(T/2)+O(N^1)
O(N) = aT(N/b)+O(N^d)
说明一下 O(N^1)是出去process1和process2之外的时间复杂度 这里主要在master函数中,由于遍历了整个数组 所以时间复杂度为O(N)
log2^2 = 1 时间复杂度为 O(logN*N ^d) 0(lognN)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值