线性表和有序表的合并

比如说我们有两个集合A和B,我们要求一个新的集合A=AUB。比如说A=(1,4,3,11)B=(2,4,3)我们需要把这两个集合中的元素合并的话,我们就可以选择一个表为基础,然后往这个表当中不断的插入这个表当中没有的元素。如果在这里我们采用的是顺序存储结构那么时间复杂度为O(m*n),如果采取链式存储结构则为O(m+n)。
void MergeList(List &LA,List LB)//将在线性表LB中但不在LA当中的元素插入到LA当中
{
   m=ListLength(LA);//求两个线性表的长度
   n=ListLength(LB);
   for(i=1;i<=n;i++)
   {
       GetElem(LB,i,e);//在LB当中取第i个元素给e
       if(!LocateElem(LA,e))//如果LA当中不存在和e相同的元素
        ListInsert(LA,++m,e);//把e插在LA的后面
   }
}
有序表的合并:数据元素在线性表当中依值非递减或非递增的有序排列,称该线性表为有序表。比如说A=(3,5,8)B=(2,6,8,9)我们需要得到的C=(2,3,5,6,8,8,9)。因为这是有序的元素存储所以我们不论存储结构和顺序存储结构还是链式存储结构时间复杂度都是O(m+n)。如果是顺序有序表的合并我们就要建立一个长度为m+n的空表。然后不断的让LA当中的元素和LB当中的元素比较。然后再就行插入。
void MergeList_Sq(SqList LA,SqList LB,SqList &LC)//LA,LB是递增排序的
{
    LC.length=LA.length+LB.length;//新表的长度为两个表的长度之和
    LC.elem=new ElemType[LC.length];//分配空间
    pc=LC.elem;//分别指向第一个元素
    pa=LA.elem;
    pb=LB.elem;
    pa_last=LA.elem+LA.length-1;//指向最后一个元素
    pb_last=LB.elem+LB.length-1;
    while((pa<=pa_last)&&(pb<=pb.last))
    {
        if(*pa<=*pb)
            *pc++=*pa++;//就行比较然后就行赋值
        else
            *pc++=*pb++;
    }
    while(pa<=pa_last)
        *pc++=*pa++;//把剩下的逐一插入
    while(pb<=pb_last)
        *pc++=*pb++;
}
如果我们选择的是链式有序表的话其实我们可以不需要再去分配空间,只需要将原来的两个链表中结点之间的关系解除那就可以了。
void MergeList_Sq(List &LA,List &LB,List &LC)//LA,LB是递增排序的
{
     pa=LA->next;//把LA和LB的值给合并了
     pb=LB->next;
     LC=LA;//LA的头结点作为LC的头结点
     pc=LC;//pc的初值指向了LC的头结点
     while(pa&&pb)
     {
         if(pa->data<=pb->data)
         {
             pc->data=pa;//pa的值比pb小的话,我们就把pa的值先插入到LC当中
             pc=pa;
             pa=pa->next;
         }
         else
         {
             pc->next=pb;//pb的值比pa小,那我们把pb插入到LC当中
             pc=pb;
             pb=pb->next;
         }
     }
     pc->next=pa?pa:pb;//哪个为空,哪个继续插入
}

                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值