数组合并是归并排序中的一个步骤,今单独就两个有序数组的合并给出代码实现。归并排序的另一个步骤就是递归,递归就是一个方法在其方法体的某个地方调用自己,这样就会将同一个逻辑不断的压栈,到达递归条件后,又一层层地出栈,直到所有方法被压栈的部分都被执行完毕,递归就结束了dd只是方法的参数值有所不同,只要设置好递归返回的条件,递归中方法能否继续压栈的条件一般也是根据方法的参数来设定的,应该就不会导致栈崩溃,最经典的例子就是计算阶乘。
问题描述:
给定两个数组,
若它们同为升序,则合并它们得到一个为升序的新数组,
如{1,3,5,7,9}和{2,4,6,8},
合并后得到{1,2,3,4,5,6,7,8,9};
若它们同为降序,则合并他们得到一个为降序的新数组,
如{8,6,4,2}和{9,7,5,3,1},
合并后得到{9,8,7,6,5,4,3,2,1}。
源码:
package compute;
/**
*@create by gzx on 2022-2-10
*/
public class ArrayMerge {
public static void main(String[] args) {
//合并升序的两个数组
int[] asc1 = {2,4,5,6,7,9};
int[] asc2 = { 1,2,3,4,5,8 };
int[] asc = mergeAsc(asc1, asc2);
for (int i : asc) {
System.out.print(i+" ");
}
System.out.println("\n----------------------");
//合并降序的两个数组
int[] desc1= {8,7,5,3,1};
int[] desc2= {9,6,4,3,2,0};
int[] desc = mergeDesc(desc1, desc2);
for (int i : desc) {
System.out.print(i+" ");
}
}
/**
* 要求a1,a2同为升序,才能合并出升序的mer数组
* @param a1 一个升序数组
* @param a2 一个升序数组
* @return mer 升序合并后的数组
*/
public static int[] mergeAsc(int[] a1, int[] a2) {
int len1 = a1.length;
int len2 = a2.length;
int mlen = len1 + len2;
int[] mer = new int[mlen];
int p1 = 0, p2 = 0, m = 0;// 分别用作数组a1,a2,mer的当前下标
while (p1 < len1 && p2 < len2) {
// 把a1和a2中当前下标对应的元素复制到mer中
if (a1[p1] <= a2[p2]) {
mer[m++] = a1[p1++];
} else {
mer[m++] = a2[p2++];
}
}
while (p1 < len1) {// 如果a1还有剩余元素,则复制到mer中
mer[m++] = a1[p1++];
}
while (p2 < len2) {// 如果a2中还有剩余元素,则复制到mer中
mer[m++] = a2[p2++];
}
return mer;
}
/**
* 要求a1,a2同为降序,才能得到同为降序的mer
* @param a1 一个降序数组
* @param a2 一个降序数组
* @return mer 降序合并后的数组
*/
public static int[] mergeDesc(int[] a1, int[] a2) {
int len1 = a1.length;
int len2 = a2.length;
int mlen = len1 + len2;
int[] mer = new int[mlen];
int p1 = 0, p2 = 0, m = 0;// 分别用作数组a1,a2,mer的当前下标
while (p1 < len1 && p2 < len2) {
// 把a1和a2中当前下标对应的元素复制到mer中
if (a1[p1] <= a2[p2]) {
mer[m++] = a2[p2++];
} else {
mer[m++] = a1[p1++];
}
}
while (p1 < len1) {// 如果a1还有剩余元素,则复制到mer中
mer[m++] = a1[p1++];
}
while (p2 < len2) {// 如果a2中还有剩余元素,则复制到mer中
mer[m++] = a2[p2++];
}
return mer;
}
}
运行结果:
1 2 2 3 4 4 5 5 6 7 8 9
----------------------
9 8 7 6 5 4 3 3 2 1 0