📜  门| GATE CS 1996 |问题9(1)

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

门 | GATE CS 1996 | 问题9

题目描述

有一个长度为n的已排序的整数数组A和一个m个元素的已排序的整数数组B。数组A的大小为n+m。

请编写一个函数merge(int A[], int B[], int n, int m),它将数组B的元素插入到A中,并确保结果数组仍然是有序的。

示例
输入:
A = [1, 3, 5, 7, 9], n = 5
B = [2, 4, 6, 8], m = 4
输出:
A = [1, 2, 3, 4, 5, 6, 7, 8, 9]
解题思路

可以使用归并排序的思想,从后往前依次比较数组A和B中的元素,将较大的元素插入到A的末尾,直到所有元素比较完毕。

代码实现
void merge(int A[], int B[], int n, int m) {
    int i = n - 1; // 指向数组A的末尾
    int j = m - 1; // 指向数组B的末尾
    int k = n + m - 1; // 指向合并后的数组的末尾

    while (i >= 0 && j >= 0) {
        if (A[i] > B[j]) {
            A[k] = A[i];
            i--;
        } else {
            A[k] = B[j];
            j--;
        }
        k--;
    }

    // 如果B中还有元素未插入到A中,则将其插入到A的合适位置
    while (j >= 0) {
        A[k] = B[j];
        k--;
        j--;
    }
}
总结

本道题目可以使用归并排序的思想,从后往前比较A和B中的元素,将较大的元素插入到A的末尾,直到所有元素比较完毕。