基本数据结构复习

package jxau.blueDot.lyx;

/**
 * 
 * @author lyx
 *	@下午5:21:58
 * @TODO:
 * 	数组归并算法
 */

/**
 * 归并:
 * 	假设有两个给定的有序数组a和b,现在要生成第三个有序数组c,它包含原有两个数组的
 * 所有成员的值
 */

/**
 * 归并思路:
 * 	首先比较a的最左(最小)成员和b的最左(最小)成员,把其中较小的值复制到c的最左
 * 成员,然后忽略这个已经被复制过的成员,继续重复上面的步骤,当我们复制完a或b的中任
 * 何一个数组的所有成员时,就把另一个数组剩下的成员全部复制到c中去。
 * 
 */

/**
 * 
 * 算法时间代价:
 * 	设a和b的长度分别为n1和n2,并设n = n1 + n2是归并后的成员总数
 * 由于每个a的成员被复制一次,每个b的成员被复制一次,所有总复制次数为
 * n1 + n2 = n
 * 	在第一个while循环中,a[i]和b[j]最多比较n-1次,因此最大次数为n-1
 * O(N1+N2) = O(N)
 */
public class ArrayMerge {

	static void merge(int[] a , int left1 , int right1 , 
								int[] b , int left2 , int right2 ,
								int[] c , int left3 ){
					
		int i = left1;
		int j = left2;
		int k = left3;
		
		//判断a b数组都未完成复制
		while(i<=right1 && j<=right2){
			
			//比较的是int类型数组,如果是其他类型,可以有其他方法(equals)
			if( (a[i]-b[j]) <=0){
								
				c[k++] = a[i++];
				
			}else{
				
				c[k++] = b[j++];
				
			}
				
		}
		
		//只剩下a数组有未复制的元素
		while(i<=right1){
			
			c[k++] = a[i++];
			
		}
		
		//只剩下b数组有未复制的元素
		while(j<=right2){
			
			c[k++] = b[j++];
			
		}
		
	}
}


转载于:https://my.oschina.net/liyixiangBlog/blog/263217

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值