### 思路
非递归归并排序通过逐步合并相邻的子数组来实现排序。每次合并后输出当前排序结果。
### 伪代码
1. 读取输入的待排序关键字个数`n`。
2. 读取`n`个待排序关键字并存储在数组中。
3. 对数组进行非递归归并排序:
- 初始化子数组的大小`curr_size`为1。
- 逐步增加子数组的大小,直到`curr_size`大于数组长度。
- 在每次合并过程中,合并相邻的子数组,并输出当前排序结果。
### C++代码
#include <iostream>
#include <vector>
using namespace std;void printArray(const vector<int>& arr) {for (size_t i = 0; i < arr.size(); ++i) {if (i > 0) cout << " ";cout << arr[i];}cout << endl;
}void merge(vector<int>& arr, int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;vector<int> L(n1), R(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;}
}void mergeSort(vector<int>& arr, int n) {for (int curr_size = 1; curr_size <= n - 1; curr_size = 2 * curr_size) {for (int left_start = 0; left_start < n - 1; left_start += 2 * curr_size) {int mid = min(left_start + curr_size - 1, n - 1);int right_end = min(left_start + 2 * curr_size - 1, n - 1);merge(arr, left_start, mid, right_end);}printArray(arr); // 输出当前排序结果}
}int main() {int n;cin >> n;vector<int> arr(n);for (int i = 0; i < n; ++i) {cin >> arr[i];}mergeSort(arr, n);return 0;
}
```
### 总结
非递归归并排序通过逐步合并相邻的子数组来实现排序。每次合并后输出当前排序结果。