Merge sorted array

想法很簡單就是開一個 temp array,然後比較兩邊的結果,小的先放入

public void mergeSortedArray(int[] A, int m, int[] B, int n) {
    int[] results = new int[m+n];

    int p1 = 0;
    int p2 = 0;
    int index = 0;
    while (p1 < m && p2 < n) {
        if (A[p1] < B[p2]) {
            results[index++] = A[p1++];
        } else if (A[p1] > B[p2]) {
            results[index++] = B[p2++];
        } else if (A[p1] == B[p2]) {
            results[index++] = A[p1++];
            results[index++] = B[p2++];
        }
    }

    if (p1 < m) {
        while (p1 < m) {
            results[index++] = A[p1++];
        }
    }

    if (p2 < n) {
        while (p2 < n) {
            results[index++] = B[p2++];
        }
    }

    for (int i=0; i<results.length; i++)
        A[i] = results[i];
}

此題有另一個方法是不開 temp array,該怎麼做?

題目有說 A 後面的空位可以塞的下 B,不過不是從前面開始比,

從前面開始比,後面的元素還要移位,所以我們可以從 A B 最後一個元素開始比,

比較大的就放到 A 的最後一個位置

public void mergeSortedArray(int[] A, int m, int[] B, int n) {
    int lastPos = m+n-1;
    int p1 = m-1;
    int p2 = n-1;
    while (p1 >= 0 && p2 >= 0) {
        if (A[p1] > B[p2]) {
            A[lastPos--] = A[p1--];
        } else if (A[p1] < B[p2]) {
            A[lastPos--] = B[p2--];
        } else {
            A[lastPos--] = B[p2--];
            A[lastPos--] = A[p1--];
        }
    }

    if (p1 >= 0) {
        while (p1 >= 0) {
            A[lastPos--] = A[p1--];
        }
    }
    if (p2 >= 0) {
        while (p2 >= 0) {
            A[lastPos--] = B[p2--];
        }
    }
}

results matching ""

    No results matching ""