已知两个顺序表A和B按元素值递增有序排列,要求写一算法实现将A和B归并成一个按元素值递减有序排列的顺序表(允许表中含有值相同的元素)。C语言
时间: 2024-02-05 19:11:19 浏览: 76
以下是一种C语言实现的算法,使用了双指针和归并排序的思想:
```c
#include <stdio.h>
#define MAX_SIZE 100
void merge(int A[], int B[], int C[], int m, int n)
{
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (A[i] > B[j]) {
C[k++] = A[i++];
} else {
C[k++] = B[j++];
}
}
while (i < m) {
C[k++] = A[i++];
}
while (j < n) {
C[k++] = B[j++];
}
}
int main()
{
int A[MAX_SIZE], B[MAX_SIZE], C[MAX_SIZE], m, n, i;
printf("Enter the size of array A: ");
scanf("%d", &m);
printf("Enter the elements of array A in increasing order:\n");
for (i = 0; i < m; i++) {
scanf("%d", &A[i]);
}
printf("Enter the size of array B: ");
scanf("%d", &n);
printf("Enter the elements of array B in increasing order:\n");
for (i = 0; i < n; i++) {
scanf("%d", &B[i]);
}
merge(A, B, C, m, n);
printf("The merged array in decreasing order is:\n");
for (i = m + n - 1; i >= 0; i--) {
printf("%d ", C[i]);
}
printf("\n");
return 0;
}
```
算法的核心是 `merge` 函数,它将两个有序数组 A 和 B 归并成一个有序数组 C。使用双指针遍历 A 和 B,比较当前元素大小,将较大的元素放入 C 中。最后将未遍历完的元素直接放入 C 中即可。
在主函数中输入两个有序数组 A 和 B,并调用 `merge` 函数进行归并。最后遍历 C 数组输出结果即可。
需要注意的是,由于要将结果按照递减的顺序输出,因此在遍历 C 数组时要从最后一个元素开始遍历。
阅读全文