题目:有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。请编写一个方法,将B合并入A并排序。给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组。
思路:开辟一片m+n大小的数组空间,从数组A和B首元素开始比较,将较小的元素放入新申请的数组的,然后不断移动来比较。本题如果不新开辟一片空间,直接结果放入数组A需要移动A中的元素,比较慢。
class Merge {
public:
int* mergeAB(int* A, int* B, int n, int m) {
// write code here
int *arr = new int[m + n];
int i = 0;
int j = 0;
int s = 0;
while (i < n && j < m){
if (A[i] <= B[j]){
arr[s++] = A[i++];
}
else{
arr[s++] = B[j++];
}
}
if (i < n){
for (; i < n; i++){
arr[s++] = A[i];
}
}
if (j < m){
for (; j < m; j++){
arr[s++] = B[j];
}
}
for (int mi = 0; mi < m + n; mi++){
A[mi] = arr[mi];
}
return A;
}
};