在C++中實現高效的合并算法通常使用歸并排序(Merge Sort)或者雙指針法(Two Pointers)。
歸并排序是一種分治算法,它將一個數組分成兩部分,分別對這兩部分進行排序,然后再合并這兩部分。這種方法的時間復雜度為O(nlogn),其中n為數組的大小。以下是一個使用歸并排序實現合并的示例代碼:
void merge(vector<int>& nums, int left, int mid, int right) {
vector<int> tmp(right - left + 1);
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
tmp[k++] = nums[i++];
} else {
tmp[k++] = nums[j++];
}
}
while (i <= mid) {
tmp[k++] = nums[i++];
}
while (j <= right) {
tmp[k++] = nums[j++];
}
for (int m = 0; m < k; ++m) {
nums[left + m] = tmp[m];
}
}
void mergeSort(vector<int>& nums, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
}
雙指針法則是通過創建兩個指針分別指向兩個數組的開頭,然后比較兩個指針指向的元素,并將較小的元素放入結果數組中。通過移動指針實現合并。這種方法的時間復雜度為O(n),其中n為數組的大小。以下是一個使用雙指針法實現合并的示例代碼:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
} else {
nums1[k--] = nums2[j--];
}
}
while (j >= 0) {
nums1[k--] = nums2[j--];
}
}
以上是兩種常用的合并算法,可以根據具體的需求選擇使用哪一種。通過使用這些合并算法,可以實現高效的合并操作。