有序数组合并

数组合并是归并排序中的一个步骤,今单独就两个有序数组的合并给出代码实现。归并排序的另一个步骤就是递归,递归就是一个方法在其方法体的某个地方调用自己,这样就会将同一个逻辑不断的压栈,到达递归条件后,又一层层地出栈,直到所有方法被压栈的部分都被执行完毕,递归就结束了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
    评论
在C语言中,可以使用归并排序的思想来完有序数组合并。具体步骤如下: 1. 定义两个有序数组,分别为arr1和arr2,以及一个用于存放合并结果的数组result。 2. 初始化三个指针,分别指向arr1、arr2和result的起始位置,记为p1、p2和p3。 3. 比较p1和p2位置上的元素大小,将较小的元素复制到result数组中的p3位置,并将对应指针向后移动一位。 4. 重复步骤3,直到其中一个数组的元素全部复制到result数组中。 5. 将剩余未复制的数组元素依次复制到result数组中。 6. 合并后,result数组即为合并后的有序数组。 以下是C语言代码示例: ```c #include <stdio.h> void mergeArrays(int arr1[], int arr2[], int size1, int size2, int result[]) { int p1 = 0; // arr1指针 int p2 = 0; // arr2指针 int p3 = 0; // result指针 // 比较两个数组元素大小,将较小的元素复制到result数组中 while (p1 < size1 && p2 < size2) { if (arr1[p1] <= arr2[p2]) { result[p3++] = arr1[p1++]; } else { result[p3++] = arr2[p2++]; } } // 将剩余未复制的数组元素依次复制到result数组中 while (p1 < size1) { result[p3++] = arr1[p1++]; } while (p2 < size2) { result[p3++] = arr2[p2++]; } } int main() { int arr1[] = {1, 3, 5, 7}; int arr2[] = {2, 4, 6, 8}; int size1 = sizeof(arr1) / sizeof(arr1[0]); int size2 = sizeof(arr2) / sizeof(arr2[0]); int result[size1 + size2]; mergeArrays(arr1, arr2, size1, size2, result); printf("合并后的有序数组:"); for (int i = 0; i < size1 + size2; i++) { printf("%d ", result[i]); } printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bitDesigner

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

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

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

打赏作者

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

抵扣说明:

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

余额充值