题目:
请设计一个能够将有序顺序表LA,LB进行合并的算法,要求合并后的顺序表LC依然有序。
例如:
LA的元素 1 3 5 7
LB的元素 2 4
LC的元素 1 2 3 4 5 7
其中,LA和LB的长度不超过1000,当中的元素为非递减排序。输入格式:
第一行输入LA的长度
第二行输入LA的元素
第三行输入LB的长度
第四行输入LB的元素
输出格式:
输入合并后顺序表中各元素的值,值之间用一个空格间隔。
输入样例1:
4 1 3 5 7 2 2 4
输出样例1:
1 2 3 4 5 7
输入样例2:
6 1 2 3 4 5 6 3 7 8 9
输出样例2:
1 2 3 4 5 6 7 8 9
代码如下:
#include <stdio.h>
#include <stdlib.h> //要使用的malloc()函数定义在这个头文件中 ,动态分配内存
#define MAX 2000
typedef struct Seq
{
int elem[MAX];
int length;
} RSeq;
RSeq init(int arr[], int len) // 初始化表
{
RSeq *R;
R = (struct Seq *)malloc(sizeof(struct Seq));
R->length = 0;
for (int i = 0; i < len; i++)
{
R->elem[R->length] = arr[i];
R->length++;
}
return (*R);
}
// 合并顺序表LA和LB
RSeq merge(RSeq LA, RSeq LB)
{
RSeq LC;
LC.length = LA.length + LB.length;
int i = 0; // 表A的位置
int j = 0; // 表B的位置
int k = 0;
while (i < LA.length && j < LB.length)
{
if (LA.elem[i] > LB.elem[j])
{
LC.elem[k] = LB.elem[j++];
}
else
{
LC.elem[k] = LA.elem[i++];
}
k++;
}
while (i < LA.length)
{
LC.elem[k++] = LA.elem[i++];
}
while (j < LB.length)
{
LC.elem[k++] = LB.elem[j++];
}
return (LC);
}
// 主函数
int main()
{
int a[MAX], b[MAX];
int ca, cb;
char temp;
scanf("%d", &ca);
for (int i = 0; i < ca; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &cb);
for (int i = 0; i < cb; i++)
{
scanf("%d", &b[i]);
}
RSeq LA, LB, LC;
LA = init(a, ca);
LB = init(b, cb);
LC = merge(LA, LB);
for (int i = 0; i < LC.length; i++)
{
printf("%d ", LC.elem[i]);
}
}