请c语言编写
时间: 2023-10-24 11:04:30 浏览: 176
好的,这是一个基于C语言的解法:
```c
#include <stdio.h>
#include <stdlib.h>
void merge(int arr[], int left[], int l_len, int right[], int r_len) {
int i = 0, j = 0, k = 0;
while (i < l_len && j < r_len) {
if (left[i] <= right[j]) {
arr[k++] = left[i++];
} else {
arr[k++] = right[j++];
}
}
while (i < l_len) {
arr[k++] = left[i++];
}
while (j < r_len) {
arr[k++] = right[j++];
}
}
void merge_sort(int arr[], int len) {
if (len <= 1) {
return;
}
int mid = len / 2;
int *left = (int *)malloc(mid * sizeof(int));
int *right = (int *)malloc((len - mid) * sizeof(int));
for (int i = 0; i < mid; i++) {
left[i] = arr[i];
}
for (int i = mid; i < len; i++) {
right[i - mid] = arr[i];
}
merge_sort(left, mid);
merge_sort(right, len - mid);
merge(arr, left, mid, right, len - mid);
free(left);
free(right);
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int arr[100];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int res[100][100];
int res_len[100];
res[0][0] = arr[0];
res_len[0] = 1;
for (int i = 1; i < n; i++) {
int j;
for (j = 0; j < res_len[i-1]; j += 2) {
int left[100], right[100];
int l_len = res_len[i-1] - j;
int r_len = (j+1 < res_len[i-1]) ? res_len[i-1] - j - 1 : 0;
for (int k = 0; k < l_len; k++) {
left[k] = res[i-1][j+k];
}
for (int k = 0; k < r_len; k++) {
right[k] = res[i-1][j+k+1];
}
merge(res[i]+j, left, l_len, right, r_len);
res_len[i] = j + l_len + r_len;
}
if (j < res_len[i-1]) {
res[i][j] = res[i-1][j];
res_len[i] = j + 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < res_len[i]; j++) {
printf("%d ", res[i][j]);
}
printf("\n");
}
}
return 0;
}
```
和Python的解法类似,我们也定义了两个函数:`merge`和`merge_sort`。`merge`函数用于合并两个有序的序列,`merge_sort`函数用于进行递归的归并排序。这里我们使用了动态内存分配的方式来避免定义多个数组。
在主函数中,我们首先读入输入数据。然后,我们定义了一个二维数组`res`和一个一维数组`res_len`,用于保存每次排序后的结果。`res[i]`表示第i趟排序后的结果,`res_len[i]`表示第i趟排序后结果的长度。我们将初始输入的序列作为第一趟排序后的结果加入到`res`中,并将`res_len[0]`设为1。接下来,我们按照题目要求,使用二路归并排序的思想来进行排序,每一次排序后,将结果加入到`res`中,并更新`res_len`。最后,我们遍历`res`,输出每次排序后的结果即可。
注意,我们使用了`while (scanf("%d", &n) != EOF)`来处理多组输入数据的情况。当没有输入数据时,程序会返回EOF,此时我们可以退出程序的执行。
阅读全文