-
算法设计
(1)设置有序顺序表C的表长,即C.listsize = C.lenghth = A.length+B.length。
(2)设置A.elem、B.elem、C.elem的下标分别为i,j,k,且初值均为0;
(3)当 i ≤ A.length 且 j ≤ B.length 时,进行A和B的合并。如果A.elem[i] ≤ B.elem[j] ,则令C.elem[k] = A.elem[i],并令 i 和 k加1;如果A.elem[i] > B.elem[j] ,则令C.elem[k] = B.elem[j] ,并令 j 和 k 加 1;
(4)如果A有剩余元素,则将其插入到C;如果B中有剩余元素。将其插入到C。 -
算法描述
结构体
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int lenght; //当前长度
int listsize; //当前分配的存储容量
}SqList;
报错函数
//处理错误信息
void Error(char *s){
printf("%s \n",s);
exit(1);
}
主函数体
void Merge_Sq(SqList A, SqList B,SqList *C){
int i,j,k;
C->lenght = A.lenght + B.lenght;
C->listsize = C->lenght;
C->elem = (ElemType*)malloc(sizeof(ElemType) * C->lenght);
if(!C->elem)
Error("OverFlow");
i = 0;
j = 0;
k = 0;
while(( i < A.lenght )&&( j < B.lenght)){
if(A.elem[i] <= B.elem[j]){
C->elem[k] = A.elem[i];
i++;
k++;
}else{
C->elem[k] = B.elem[j];
j++;
k++;
}
}
while( i < A.lenght){
C->elem[k] = A.elem[i];
k++;
i++;
}
while(j < B.lenght){
C->elem[k] = B.elem[j];
k++;
j++;
}
}
- 算法分析
(1)问题规模:表A的“当前长度”(设置为n)与表B的“当前长度”(设置为m)之和。
(2)基本操作:数据元素赋值、下标修改。
(3)时间分析:算法执行时间主要花费在三个while循环的基本操作上,执行的总次数为 n+m ,因此算法的时间复杂度为 O( n+m )。