题目
- 原文:
You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. Write a method to merge B into A in sorted order. - 译文:
A和B是两个有序数组(假设为递增序列),而且A的长度足以放下A和B中所有的元素, 写一个函数将数组B融入数组A,并使其有序。
分析
- 最简单的方法是新开一个数组C,将A(i++)和B(j++)从前往后依次比较较小的那个放入C(k++),但是这样的空间复杂度为O(m+n)。由于题目中明确指出A的大小已经足够容纳, 所以直接在A上直接操作即可。
- 可是如果我们还是按照从前往后对比数组A和数组B,依次取较小的元素放入数组A, 这样就有要放入的位置上A本身元素的问题,处理起来就麻烦了。
- 相反,如果我们从A和B的尾部元素开始对比,每次取大的元素放在融入B后数组A的尾部, 这样一来,要放入的位置就不会出现上面的冲突问题。当对比结束时, 即可得到一个排好序的数组A,代码如下。
代码
#include<iostream>
using namespace std;
void merge(int a[], int b[], int m, int n) {
int k = m + n - 1;
int i = m - 1;
int j = n - 1;
while(i >= 0 && j >= 0) {
int n = k;
a[k--] = (a[i] > b[j]) ? a[i--] : b[j--];
}
while(j >= 0) {
a[k--] = b[j--];
}
}
void printarray(int a[], int m) {
for(int i = 0; i < m; i++) {
cout << a[i] << " ";
}
}
int main() {
int a[] = {1, 3, 5, 7, 9};
int b[] = {2, 4, 6, 8};
int m = sizeof(a) / sizeof(int);
int n = sizeof(b) / sizeof(int);
merge(a, b, m, n);
cout << "a merge b is:";
printarray(a, m+1);
}
结果