归并排序 Java实现(递归试)

归并排序详解
本文介绍了一种高效的排序算法——归并排序。通过递归将数组分成较小的部分,并将这些部分合并为有序序列。该算法的时间复杂度为O(n*log(n)),适用于多种应用场景。

归并排序: 将两个有序的序列合并成一个有序的序列,相当于手中有两副已经排好序并且每副单独叠到一起的牌,一次判断大小,再重新放到一个新的位置并排好序

  1. 对于一副混乱的牌而言,可以将牌分成两两一组,再依次合并排序,归并排序算法复杂度 纵向递归深度log(n) 横向比较次数为c*n,复杂度为O(n*log(n))
public class MergeQuene {

	static public int[] mergeQuene(int[] number,int leftEdge,int rightEdge){
		int middle = (leftEdge+rightEdge)/2;
		if(rightEdge>leftEdge){
			//递归调用 
			mergeQuene(number,leftEdge,middle);
			mergeQuene(number,middle+1,rightEdge);
			mergeAlgo(number, leftEdge, rightEdge);
		}
			return number;
	}
	
	static private int[] mergeAlgo(int[] arr,int leftEdge,int rightEdge){
		//加取余的原因: 在排序数非偶数个时,由于左边两个已经排序完成,需要在分组时放到相同的序列中
		int leftNum=(rightEdge-leftEdge+1)/2+(rightEdge-leftEdge+1)%2;
		int rightNum=rightEdge-leftEdge+1-leftNum;
		
		//左右两个数组赋值
		int[] leftArr = new int[leftNum];
		int[] rightArr = new int[rightNum];
		for(int i=0;i<leftNum;i++){
			leftArr[i]=arr[i+leftEdge-1];
		}
		for(int j=0;j<rightNum;j++){
			rightArr[j]=arr[j+rightEdge-rightNum];
		}
		//对左右两个数组进行归并排序,对于其中一组数据用完,则第二组直接赋值
		int m=0,n=0;
		for(int i=0;i<leftNum+rightNum;i++){
			if(leftArr[m]<rightArr[n]){
				arr[i+leftEdge-1]=leftArr[m];
				m++;
				if(m>=leftNum){
					for(;i<leftNum+rightNum-1;i++){
						arr[i+leftEdge]=rightArr[n];
						n++;
					}
					return arr;
				}
				
			}else{
				arr[i+leftEdge-1]=rightArr[n];
				n++;
				if(n>=rightNum){
					for(;i<leftNum+rightNum-1;i++){
						arr[i+leftEdge]=leftArr[m];
						m++;
					}
					return arr;
				}
			}
		}
		printArr(arr);
		return arr;	
	}
	
	public static void printArr(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.println("quene arr  "+arr[i]);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值