两个有序的数组,合并成一个有序的数组

本文介绍了一种将两个已排序的整数数组合并为一个有序数组的方法。该算法的时间复杂度为O(m+n),其中m和n分别为两个输入数组的长度。通过逐个比较两个数组中的元素并选择较小者加入新数组,最终实现合并。
/**
 * 两个有序的数组,合并成一个有序的数组
 * @author ccq
 *
 */
public class Test1 {

	public static void main(String[] args) {
		int[] a = new int[] { 1, 3, 5, 7, 8, 8, 9, 100, 111, 222 };
		int[] b = new int[] { 2, 3, 4, 5, 6, 7, 8 };
		int arr[] = sortArr(a, b);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
	}

	/**
	 * 算法复杂度O(m+n)
	 * m : a数组的长度
	 * n : b数组的长度
	 * @param a
	 * @param b
	 * @return arr 合并后的数组
	 */
	public static int[] sortArr(int[] a, int[] b) {
		
		int sum = 0;
		
		int aIndex = 0;
		int bIndex = 0;
		int arrIndex = 0;
		
		int aLen = a.length;
		int bLen = b.length;

		int[] arr = new int[aLen + bLen];

		while (aIndex < aLen && bIndex < bLen) {
			if (a[aIndex] < b[bIndex]) {
				arr[arrIndex++] = a[aIndex++];
			}else if(a[aIndex] == b[bIndex]){
				arr[arrIndex++] = a[aIndex++];
				arr[arrIndex++] = b[bIndex++];
			}else {
				arr[arrIndex++] = b[bIndex++];
			}
			
			sum++;
		}

		for (int i = aIndex; i < aLen; i++) {
			arr[arrIndex++] = a[i];
			sum++;
		}
		for (int i = bIndex; i < bLen; i++) {
			arr[arrIndex++] = b[i];
			sum++;
		}
		
		System.out.println("sum = " + sum + ", a+b = " + (aLen + bLen));
		return arr;
	}

}


                
以下是几种将两个有序数组合并一个有序数组的方法: #### Java 实现 ```java import java.util.Arrays; public class ArraySortTest { public static void main(String[] args) { // 给定2个有序数组合并一个有序数组 int[] a = {2, 5, 7, 8, 17}; int[] b = {1, 3, 6, 9, 13, 18}; // 创建合并之后的数组 int[] arraySort = new int[a.length + b.length]; // 先将a放入array for (int i = 0; i < a.length; i++) { arraySort[i] = a[i]; } // 再将b放入array for (int j = 0; j < b.length; j++) { arraySort[a.length + j] = b[j]; } // 最后对array进行排序 Arrays.sort(arraySort); for (int i : arraySort) { System.out.print(i + ","); } } } ``` 此方法先将两个数组合并一个数组,再使用 `Arrays.sort()` 方法对新数组排序[^1]。 #### JavaScript 实现 ```javascript function mergeTwoSortedArr(arr1, arr2) { var retArr = []; // 遍历比较两个数组的首元素大小,小者 shift 出来 push 到结果数组中去 while (arr1.length > 0 && arr2.length > 0) { if (arr1[0] < arr2[0]) { retArr.push(arr1.shift()); } else if (arr1[0] > arr2[0]) { retArr.push(arr2.shift()); } else { retArr.push(arr1.shift()); retArr.push(arr2.shift()); } } // 将数组(最多有一个)剩余元素移出放置到结果数组中 while (arr1.length > 0) { retArr.push(arr1.shift()); } while (arr2.length > 0) { retArr.push(arr2.shift()); } return retArr; } // 示例 var arr1 = [2, 3, 5]; var arr2 = [3, 4, 7, 9]; console.log(mergeTwoSortedArr(arr1, arr2)); ``` 该算法思路是始终比较两个数组的首元素大小,将小者 `shift` 出来 `push` 到结果数组中,最后将剩余元素放入结果数组[^2]。 #### C 语言实现 ```c #include <stdio.h> #define N 20 int main() { int a[N] = {0}, b[N] = {0}; int i, j, k, anum, bnum, c[N + N]; scanf("%d", &anum); // 输入数组a元素个数 for (i = 0; i < anum; i++) { scanf("%d", &a[i]); } scanf("%d", &bnum); // 输入数组b元素个数 for (i = 0; i < bnum; i++) { scanf("%d", &b[i]); } // 在数组a和b都有数据时比较两个数组 i = 0, j = 0, k = 0; while (i < anum && j < bnum) { if (a[i] >= b[j]) { c[k] = b[j]; k++; j++; } else { c[k] = a[i]; k++; i++; } } // 如果数组a还有数据 for (i; i < anum; i++) { c[k] = a[i]; k++; } // 如果数组b还有数据 for (j; j < bnum; j++) { c[k++] = b[j]; } // 输出数组c for (i = 0; i < anum + bnum; i++) { printf("%d ", c[i]); } return 0; } ``` 此方法通过比较两个数组元素大小,将小的元素依次放入新数组,最后处理剩余元素[^3]。 #### C++ 实现 ```cpp #include <iostream> using namespace std; #define MAX 100 int main() { int a[MAX] = {1, 3, 5, 7, 9}; int b[MAX] = {2, 4, 6, 8}; int len1 = 5, len2 = 4; int p1 = len1 - 1, p2 = len2 - 1; // 从后往前遍历 int q = len1 + len2 - 1; while (p1 >= 0 && p2 >= 0) { // 二者长度相等部分 if (a[p1] >= b[p2]) { a[q] = a[p1]; p1--; q--; } else { a[q] = b[p2]; q--; p2--; } } while (p1 >= 0) { // 假如a数组多出来 a[q] = a[p1]; q--; p1--; } while (p2 >= 0) { // 假如b数组多出来 a[q] = b[p2]; q--; p2--; } for (int i = 0; i < len1 + len2; i++) cout << a[i] << ' '; cout << endl; return 0; } ``` 该方法从后往前遍历两个数组,将大的元素放入合并数组,最后处理剩余元素[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值