将两个有序顺序表A和B合并成为一个新的有序顺序表C(C语言版)

  1. 算法设计
    (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。

  2. 算法描述

结构体

#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. 算法分析
    (1)问题规模:表A的“当前长度”(设置为n)与表B的“当前长度”(设置为m)之和。
    (2)基本操作:数据元素赋值、下标修改。
    (3)时间分析:算法执行时间主要花费在三个while循环的基本操作上,执行的总次数为 n+m ,因此算法的时间复杂度为 O( n+m )
  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值