給定兩個已排序數組 A、B,其中 A 尾部預留足夠空間容納 B。請將 B 合併到 A 中並保持有序,要求 原地修改 A,空間複雜度 O(1)。
若從頭部合併,需搬移 A 中元素,時間複雜度退化。利用 A 尾部空閒空間,從最大值開始比較,填入 A 末尾,避免覆蓋未處理數據。
indexA = lastA - 1、indexB = lastB - 1、mergeIndex = lastA + lastB - 1。A[indexA] 與 B[indexB],較大者放入 A[mergeIndex],對應指針前移。B 剩餘元素未處理完,直接拷貝至 A 前部(A 剩餘元素已在正確位置)。public class MergeSortedArray {
/**
* @param a 目標數組(含尾部預留空間)
* @param b 來源數組
* @param lastA a 中實際有效元素個數
* @param lastB b 中實際有效元素個數
*/
public static void mergeOrder(int[] a, int[] b, int lastA, int lastB) {
int indexA = lastA - 1;
int indexB = lastB - 1;
int mergeIndex = lastA + lastB - 1;
while (indexA >= 0 && indexB >= 0) {
if (a[indexA] > b[indexB]) {
a[mergeIndex--] = a[indexA--];
} else {
a[mergeIndex--] = b[indexB--];
}
}
// B 剩餘元素直接拷貝
while (indexB >= 0) {
a[mergeIndex--] = b[indexB--];
}
}
}
A 空間不足,需申請新數組,空間變為 O(m+n)。