package NC;
/**
 * NC22 合并两个有序的数组
 *
 * 给出一个整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组
 *
 * 数据范围: ,,
 *
 * 注意:
 * 1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
 * 2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了
 * 3. A 数组在[0,m-1]的范围也是有序的
 *
 * @author Tang
 * @date 2021/9/29
 */
public class Merge {
    /**
     * 用空间换时间
     *
     *
     * @param A
     * @param m
     * @param B
     * @param n
     */
    public void merge(int A[], int m, int B[], int n) {
        int[] temp = new int[m];
        for(int i = 0; i < temp.length; i++) {
            temp[i] = A[i];
        }
        int indexB = 0;
        int indexA = 0;
        int index = 0;
        while(index < A.length) {
            if(indexB >= n) {
                for(int i = indexA; i < m; i++) {
                    A[index] = temp[indexA];
                    index++;
                    indexA++;
                }
                break;
            }
            while(indexA < m && temp[indexA] <= B[indexB]) {
                A[index] = temp[indexA];
                index ++;
                indexA++;
            }
            if(indexA >= m) {
                for(int i = indexB; i < n; i++) {
                    A[index] = B[indexB];
                    index++;
                    indexB++;
                }
                break;
            }
            while(indexB < n && temp[indexA] >= B[indexB]) {
                A[index] = B[indexB];
                index++;
                indexB++;
            }
        }
    }
    public static void main(String[] args) {
        int A[] = {1,2,2,0,0,0};
        int B[] = {3,5,6};
        new Merge().merge(A,3,B,3);
    }
}