### 思路
非递归归并排序通过逐步合并相邻的子数组来实现排序。每次合并后输出当前排序结果。
### 伪代码
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;
}
```
### 总结
非递归归并排序通过逐步合并相邻的子数组来实现排序。每次合并后输出当前排序结果。