Given two sorted integer arrays A and B, merge B into A as one sorted array.
常规思想:
从B的起始位置开始,将选中的值与A数组值逐一判断,找到A[i]大于B[j]的i将其插入,如此迭代下去。
public static void merge(int A[], int m, int B[], int n) {
if (m == 0) {
for (int i = 0; i < n; i++) {
A[i] = B[i];
}
}
int a = 0, b = 0;
while (b < n) {
while (B[b] >= A[a]&& a < m) {
a++;
}
if (a < m) {
for (int i = m; i > a; i--) {
A[i] = A[i - 1];
}
A[a] = B[b];
} else {
A[m] = B[b];
}
a++;
b++;
m++;
}
}
ps ,此方法存在弊端,在每次插入,需要迭代数组,复杂度比较大,O(n*m/2)。
另一种好的方法:
假设 A数组 大小为 m; B数组大小为 n
由题可知,最后合并成的数组A,大小必定是A+B,也即n+m,既然这样,为什么不从n+m-1位开始,
从 n-1 开始,比较 B[n-1]与A[m-1] 将大的赋值给A[n+m-1],依次迭代下去,
public static void mergeNew(int A[], int m, int B[], int n){
<span style="white-space:pre"> </span>int k=m+n;
<span style="white-space:pre"> </span>while (k-->0) {
<span style="white-space:pre"> </span>A[k]=(n==0||(m>0&&A[m-1]>B[n-1]))?A[--m]:B[--n];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}