用c语言写这道题的代码:给出序列A和序列B,判断序列B是否序列A经过m趟插入排序后得到的非降序结果。是的话,给出序列A第m+1趟插入排序的结果。不是的话,给出序列A第m趟插入排序的结果。 输入格式: 输入有三行: 第一行是n值和m值,表示序列的元素个数以及排序趟数。1<=n<=10000, 1<=m<n-1. 第二行是序列A的n个元素。 第三行是序列B的n个元素。 输出格式: 输出有两行: 第一行是YES或NO,表示B是否A第m趟插入排序的结果。 第二行是n个数,表示第m+1趟或第m趟插入排序的结果。 行末不能有空格。 输入样例1: 5 2 6 3 0 1 9 0 3 6 1 9 输出样例1: YES 0 1 3 6 9 输入样例2: 5 2 6 3 0 1 9 0 6 3 1 9 输出样例2: NO 0 3 6 1 9
时间: 2024-03-24 07:35:59 浏览: 79
以下是用 C 语言实现该题目的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 10000
int n, m;
int A[MAX_N], B[MAX_N], tmp[MAX_N];
void merge_sort(int l, int r) {
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1, k = l;
while (i <= mid && j <= r) {
if (A[i] <= A[j]) tmp[k++] = A[i++];
else tmp[k++] = A[j++];
}
while (i <= mid) tmp[k++] = A[i++];
while (j <= r) tmp[k++] = A[j++];
for (i = l; i <= r; i++) A[i] = tmp[i];
}
int is_same(int *a, int *b) {
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
return 0;
}
}
return 1;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &A[i]);
B[i] = A[i];
}
for (int i = 0; i < m; i++) {
merge_sort(0, n - 1);
if (is_same(A, B)) {
printf("YES\n");
for (int j = 0; j < n; j++) {
printf("%d", A[j]);
if (j != n - 1) printf(" ");
}
printf("\n");
return 0;
}
}
merge_sort(0, n - 1);
if (is_same(A, B)) {
printf("YES\n");
} else {
printf("NO\n");
}
for (int j = 0; j < n; j++) {
printf("%d", A[j]);
if (j != n - 1) printf(" ");
}
printf("\n");
return 0;
}
```
代码思路:
1. 定义 `merge_sort` 函数,用于对序列 A 进行归并排序。
2. 定义 `is_same` 函数,用于判断序列 A 是否与序列 B 相同。
3. 读入 n 和 m,以及序列 A。
4. 将序列 A 复制到序列 B 中。
5. 进行 m 趟插入排序,每趟排序后判断序列 A 是否与序列 B 相同,如果相同则输出结果并结束程序。
6. 如果进行了 m 趟排序后序列 A 仍与序列 B 不同,则进行第 m+1 趟排序,并输出结果。
代码中的 `merge_sort` 函数使用了归并排序算法,时间复杂度为 O(n log n)。
阅读全文