归并排序(MergeSort)实现问题:合并后无法输出完整数组
解决方案
问题出在你的printArray函数仅打印合并的子数组,而题目要求输出完整数组并标注合并区间。以下是修改后的代码,核心调整是新增打印完整数组并高亮合并区间的函数,同时传递数组长度到合并流程中:
#include <iostream> using namespace std; // 打印完整数组,合并区间[mergeLeft, mergeRight]用[]标注 void printFullArrayWithMerge(int arr[], int n, int mergeLeft, int mergeRight) { for (int i = 0; i < n; ++i) { // 到达合并区间起始位置,输出左括号 if (i == mergeLeft) { cout << "[ "; } cout << arr[i]; // 非最后一个元素输出空格分隔 if (i < n - 1) { cout << " "; } // 到达合并区间结束位置,输出右括号 if (i == mergeRight) { cout << " ]"; } } cout << endl; } void merge(int arr[], int left, int mid, int right, int n) { int n1 = mid - left + 1; int n2 = right - mid; int* L = new int[n1]; int* R = new int[n2]; for (int i = 0; i < n1; ++i) L[i] = arr[left + i]; for (int j = 0; j < n2; ++j) R[j] = arr[mid + 1 + j]; int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; ++i; } else { arr[k] = R[j]; ++j; } ++k; } while (i < n1) { arr[k] = L[i]; ++i; ++k; } while (j < n2) { arr[k] = R[j]; ++j; ++k; } // 打印完整数组及合并区间 printFullArrayWithMerge(arr, n, left, right); delete[] L; delete[] R; } // 新增数组长度参数n,传递给merge函数 void mergeSort(int arr[], int left, int right, int n) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(arr, left, mid, n); mergeSort(arr, mid + 1, right, n); merge(arr, left, mid, right, n); } } int main() { int N; cin >> N; int* arr = new int[N]; for (int i = 0; i < N; ++i) cin >> arr[i]; // 调用时传递数组长度N mergeSort(arr, 0, N - 1, N); delete[] arr; return 0; }
修改说明
- 新增
printFullArrayWithMerge函数:遍历整个数组,在合并区间的起始和结束位置分别添加[和],其余元素正常输出,满足题目要求的完整数组+合并部分标注的格式。 - 传递数组长度:给
mergeSort和merge函数新增数组长度参数n,确保打印函数能访问到整个数组的所有元素。 - 替换打印逻辑:将
merge函数中原有的子数组打印调用,替换为新的完整数组打印函数。
内容的提问来源于stack exchange,提问作者Mai Dương
相关产品推荐
相关产品推荐

