一【题目类别】
二【题目来源】
- 本题目选自王道2023考研计算机数据结构复习指导18页中二、综合应用题之07题
三【题目描述】
- 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
四【解题思路】
- 这道题目还是比较经典的,在各个高校的计算机考研真题中频频出现,或为原题,或为改编题,但是我们只要理解了这种类型题目的本质,这种题看起来就不是那么难了。我们利用题目给的信息:初始化两个顺序表都为有序顺序表,那么自然就想到利用这个性质,我们扫描两个顺序表,比较两个顺序表中元素的大小关系,我们只需要将小的那个存入新的顺序表中,然后继续向下重复操作即可。需要注意的是,有可能会有一种情况就是:某一个顺序表会有剩余,那么我们只需要把剩余这部分存入新的顺序表即可
五【时间频度】
- 时间复杂度:
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n)),其中
m
、
n
m、n
m、n为两个待合并顺序表长度
- 空间复杂度:
O
(
1
)
O(1)
O(1)
六【代码实现】
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
void Merge(SqList A, SqList B)
{
if (A.length + B.length > MaxSize)
{
return 0;
}
SqList C;
C.length = 0;
int indexA = 0, indexB = 0, indexC = 0;
while (indexA < A.length && indexB < B.length)
{
if (A.data[indexA] <= B.data[indexB])
{
C.data[indexC++] = A.data[indexA++];
}
else
{
C.data[indexC++] = B.data[indexB++];
}
}
while (indexA < A.length)
{
C.data[indexC++] = A.data[indexA++];
}
while (indexB < B.length)
{
C.data[indexC++] = B.data[indexB++];
}
C.length = indexC;
printf("合并后的顺序表为:");
for (int i = 0; i < C.length; i++)
{
printf("%d ", C.data[i]);
}
printf("\n");
}
int main()
{
SqList A,B;
A.length = 0;
B.length = 0;
int lenA, lenB;
printf("请输入顺序表A的长度(长度应≤25):");
scanf("%d", &lenA);
printf("请输入顺序表B的长度(长度应≤25):");
scanf("%d", &lenB);
printf("请输入顺序表A的元素:");
for (int i = 0; i < lenA; i++)
{
scanf("%d", &A.data[i]);
A.length++;
}
printf("请输入顺序表B的元素:");
for (int i = 0; i < lenB; i++)
{
scanf("%d", &B.data[i]);
B.length++;
}
printf("初始顺序表A为:");
for (int i = 0; i < A.length; i++)
{
printf("%d ", A.data[i]);
}
printf("\n");
printf("初始顺序表B为:");
for (int i = 0; i < B.length; i++)
{
printf("%d ", B.data[i]);
}
printf("\n");
Merge(A, B);
system("pause");
return 0;
}
七【程序测试】