给定一个整数序列,请按非递减序输出采用二路归并排序(递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。
输出格式:
对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。
输入样例:
6
73 12 27 98 81 64
输出样例:
12 73 27 98 81 64
12 27 73 98 81 64
12 27 73 81 98 64
12 27 73 64 81 98
12 27 64 73 81 98
来源:
[1] 黄龙军, 等. 数据结构与算法, 上海:上海交通大学出版社, 2022.7. ISBN: 9787313269881
[2] 黄龙军, 等. 数据结构与算法(Python版),上海: 上海交通大学出版社, 2023. ISBN: 9787313280732
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
(归并算法好难,改bug改了半天/(ㄒoㄒ)/~~)
代码
#include<iostream>
#include<algorithm>
#define SIZE 105
using namespace std;
int B[SIZE]; //用于暂存数据
void merge(int A[], int low, int mid, int high)
{
for (int k = low; k <= high; k++)
B[k] = A[k];
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high)
{
if (B[i] > B[j])
{
A[k++] = B[j++];
}
else
{
A[k++] = B[i++];
}
}
while (i <= mid)
A[k++] = B[i++];
while (j <= high)
A[k++] = B[j++];
}
void merge_sort(int A[], int low,int high,int length)
{
if (low < high)
{
int mid = (low + high) / 2;
merge_sort(A, low,mid,length);
merge_sort(A, mid + 1, high,length);
merge(A,low,mid,high);
for (int i = 0; i<length-1 ; i++)
{
cout << A[i] << " " ;
}
cout << A[length - 1] << endl;
}
}
int main()
{
int n;
while (cin >> n) {
int* p = new int[n];
for (int i = 0; i < n; i++) {
cin >> p[i];
}
merge_sort(p, 0, n - 1, n);
delete[] p;
}
}