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