/**
* 面试题 10.01. 合并排序的数组
* @author wsq
* @date 2020/09/08
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
说明:
A.length == n + m
链接:https://leetcode-cn.com/problems/sorted-merge-lcci
*/
package notsubmit;
public class MergeTwoSortedArray {
/**
* 在原有的A数组的基础上从后往前合并,减少插入位置后的其他元素移动次数,提高效率
* @param A
* @param m
* @param B
* @param n
*/
public void merge(int[] A, int m, int[] B, int n) {
int totalLen = m + n;
int p = totalLen - 1;
while(m > 0 && n > 0) {
if(A[m-1] >= B[n-1]) {
A[p--] = A[--m];
}else {
A[p--] = B[--n];
}
}
if(n > 0) {
while(n > 0) {
A[p--] = B[--n];
}
}
}
public static void main(String[] args) {
int[] A = {1,2,3,0,0,0};
int m = 3;
int[] B = {2,5,6};
int n = 3;
MergeTwoSortedArray mergeArray = new MergeTwoSortedArray();
mergeArray.merge(A, m, B, n);
for(int i: A) {
System.out.println(i);
}
}
}