📜  门| GATE-CS-2004 |第 44 题(1)

📅  最后修改于: 2023-12-03 15:12:40.730000             🧑  作者: Mango

题目描述

有两个排序后的整数数组A和B,A数组的长度为m,B数组的长度为n。将这两个数组合并成一个新的数组C,使得C数组的长度为m+n,并且C数组也是一个排序数组。请实现该函数,要求算法的时间复杂度为O(m+n)。

函数原型:int* merge(int A[], int m, int B[], int n);

解题思路

对于已排序的数组A和B,我们可以用类似归并排序的方式将它们合并成一个有序数组C。具体的合并过程如下:

  1. 初始化两个指针ij分别指向数组A和B的第一个元素;
  2. 初始化一个空数组C,长度为m+n;
  3. 从数组A和B中依次取出较小的元素,放入数组C中,直到其中一个数组遍历完毕;
  4. 将另一个数组中剩余的元素依次放入数组C中;
  5. 返回数组C。
代码实现
int* merge(int A[], int m, int B[], int n) {
    int* C = (int*)malloc(sizeof(int) * (m + n));
    int i = 0, j = 0, k = 0;

    while (i < m && j < n) {
        if (A[i] < B[j]) {
            C[k++] = A[i++];
        } else {
            C[k++] = B[j++];
        }
    }

    while (i < m) {
        C[k++] = A[i++];
    }

    while (j < n) {
        C[k++] = B[j++];
    }

    return C;
}
复杂度分析

该算法的时间复杂度为O(m+n),空间复杂度为O(m+n)。因为需要创建一个新的数组C来存储合并后的结果。