俩个有序顺序表的合并(好好学习)

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 今天上课的时候老师提到了这题,上课的时候脑子卡了,居然没做出来,在路上才想起来怎么操作对于这道题首先考虑的是LA LB为空的三种情况,
Elementype GetElem(list L, Position pos)
{
  if (pos<0 || pos>L->last)
  {
    return ERROR;
  }
  else
  {
    return L->Data[pos];
  }
}
//给出LA LB俩个递增顺序表,要求合并成为LC有序链表(LC为空)
struct LNode {
  Elementype Data[Maxszie];
  Position Last
};
//Last为最后一个下标值

今天上课的时候老师提到了这题,上课的时候脑子卡了,居然没做出来,在路上才想起来怎么操作


对于这道题首先考虑的是LA  LB为空的三种情况,



void merge(list a,list b,list c)

2.即LA为空,LB不为空的时候,将LA的Data全部拷贝进去,将LC->Last调为LB->Last


3.即LB为空,LA不为空的时候,将LB的Data全部拷贝进去,将LC->Last调为LC->Last


这三种是比较先考虑的,拷贝for循环就对了;(为空的判断的条件为Last=-1)


  if (a->Last == -1 && b->Last == -1)
  {
    return;
  }
  else if (a->Last != -1 && b->Last == -1)
  {
    for (int i = 0; i <= a->Last; i++)
    {
      c->Data[i] = a->Data[i];
    }
    c->Last = a->Last;
  }
  else if (b->Last != -1 && a->Last == -1)
  {
    for (int i = 0; i <= b->Last; i++)
    {
      c->Data[i] = b->Data[i];
    }
    c->Last = b->Last;
  }

接下来就是一些比较常规的情况了;我的想法是定义三个类似指针的玩意,来定位三个顺序表的下标。即pa =pb= pc=0;然后开始循环进行比较插入,判断pa pb对应位置的数据大小,那个小就把该下标下的data值赋给LC顺序表,循环下去直到pa 大于LA->Last,或者pb 大于LB->Last,最后只要还没有插入LC中的对应LA或LB的值全部插进LC


听到这里可能还有点懵,那么我们就用图来说明以下吧



刚开始的时候:

56df39e412ff4599afb10fbb00ec8dec.png

第一次以后,pa++,pc++

25d91491652349958ef8be4de1687810.png

第二次 pa++,pc++

acd4ad03725043a2a614bf0b89b23f4b.png

第三次:pb++,pc++

87e5a88dab094796b5964e6cbf998603.png 第四次:pa++,pc++

62811d1fc7f349a4985b29a30649e2cb.png

到这个时候我们发现pa已经大于LA-->Last   ,接下来就只需要把LB后面的全部放进去就可以了

45fa62b20ef5403fbd3584ca37f25831.png

这就是完成这道题的基本思路了,那么如何将PB中未插的数据如何全部插入呢,很简单。一个for循环,我们可以知道这个时候 pa大于 LA->last   但pb小于LB->Last;所以只要for循环到pb大于LB->Last就可以了!!!


这个时候的控制条件一定要十小心!!!


在代码的时候要判断到底是LA全部插了还是LB全部插了,可以通过

if (pa > a->Last )
这个是PA全部插入了


以下是代码实现:



  else 
  {
    c->Last = a->Last + b->Last + 1;
    int pa, pb, pc;
    pa = pb = pc = 0;
    for (; pa <= a->Last&&pb <=b->Last; pc++)
    //如果a的都插入或b全部插入了,就结束
    {
      if (a->Data[pa]< b->Data[pb])
      {
        c->Date[pc] = a->Data[pa];
        pa++;
      }
      else
      {
        c->Data[pc] = b->Data[pb];
        pb++;
      }
    }
    if (pa > a->Last )
    //如果是a表的全部插入了,那么就将b表全部插入
    {
      for (; pb <= b->Last; pb++,pc++)
      {
        c->Data[pc] = b->Data[pb];
      }
    }
    else//如果是b表的全部插入了,那么就将a表全部插入
    {
      for (; pa <= a->Last; pa++, pc++)
      {
        c->Data[pc] = a->Data[pa];
      }
    }
  }



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
数据可视化 Linux
Linux centos7.x系统 下没有ens33 网卡的解决方案
此时还没有enp0s31f6网卡相关的配置信息 , 所以我们需要配置enp0s31f6网卡相关的信息
1649 0
|
SQL 存储 数据可视化
使用Java分析器优化代码性能,解决OOM问题
使用Java分析器优化代码性能,解决OOM问题
|
算法
串ababaaababaa的next和串ababaabab的nextval
本文介绍了计算字符串的next数组和nextval数组的方法,通过分析两个具体的例子来展示如何计算这些数组,这些数组通常用于KMP算法中。
761 0
串ababaaababaa的next和串ababaabab的nextval
|
10月前
|
监控 Linux
Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC
通过以上步骤,可以有效解决 systemd 服务启动失败并报错 `Main process exited, code=exited, status=203/EXEC` 的问题。关键在于仔细检查单元文件配置、验证可执行文件的有效性,并通过日志分析具体错误原因。确保可执行文件路径正确、文件具有执行权限,并且可以独立运行,将有助于快速定位和解决问题。
4531 7
|
机器学习/深度学习 数据可视化 数据挖掘
数据降维 | MATLAB实现T-SNE降维特征可视化
数据降维 | MATLAB实现T-SNE降维特征可视化
|
9月前
|
存储 算法 iOS开发
【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量(通俗易懂版)
【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量(通俗易懂版)
|
数据可视化 算法 Java
国人开发的JAVA三维可视化组件:Matplot 3D for JAVA(V3.0) 一个业余程序员用纯JAVA开发的科学数据可视化组件包
Matplot3D for JAVA(V3.0) 是一个基于JAVA SE 1.8环境开发的三维图形图表组件。 组件由纯JAVA SE 实现(Pure Java) ,封装为一个jar包,jar文件大小不超过300KB。内含自主研发的三维几何造型、绘制算法,无需依赖OpenGL、DriectX、JAVA 3D或JAVAFX等等第三方库,其只依托JRE自带的类库即可(即只需安装了JAVA就可使用),可以非常方便的将Matplot3D for JAVA(V3.0)显示面板嵌入到自己JAVA GUI程序中,或者生成图片用于Web动态页面中。
1266 0
国人开发的JAVA三维可视化组件:Matplot 3D for JAVA(V3.0)  一个业余程序员用纯JAVA开发的科学数据可视化组件包
|
存储 搜索推荐 算法
【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)
【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)
1241 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue的在线教学平台附带文章和源代码
基于SpringBoot+Vue的在线教学平台附带文章和源代码
268 0