有序数组合并

数组合并是归并排序中的一个步骤,今单独就两个有序数组的合并给出代码实现。归并排序的另一个步骤就是递归,递归就是一个方法在其方法体的某个地方调用自己,这样就会将同一个逻辑不断的压栈,到达递归条件后,又一层层地出栈,直到所有方法被压栈的部分都被执行完毕,递归就结束了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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bitDesigner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值