【数据结构】第2章 线性表 有序表的合并

您所在的位置:网站首页 有序的序 【数据结构】第2章 线性表 有序表的合并

【数据结构】第2章 线性表 有序表的合并

2024-07-11 00:34| 来源: 网络整理| 查看: 265

【有序顺序表的初始化、插入、遍历、合并;有序单链表的遍历、后插法(尾插法)创建、合并】算法步骤+完整代码

若线性表中的数据元素相互之间可以比较, 并且数据元素在线性表中依值非递减或非递增有序排列,则称该线性表为有序表(OrderedList)。

现求解有序集合的并集问题。 【问题描述】 有序集合是指集合中的元素有序排列。 已知两个有序集合A和B, 数据元素按值非递减有序排列, 现要求一个新的集合C=AUB, 使集合C中的数据元素仍按值非递减有序排列。 例如, 设 A= (3, 5, 8, 11) B=(2, 6, 8, 9, 11, 15, 20) 则 C = (2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20) 【问题分析】 与线性表的合并一样, 可以利用两个线性表LA和LB分别表示集合A和B, 不同的是,此例中的 LA和LB有序, 这样便没有必要从LB中依次取得每个数据元素,到LA中进行查访。 如果LA和LB两个表长分别记为m和n, 则合并后的新表LC的表长应该 为m+n。由于LC 中的数据元素或是LA中的元素,或是LB中的元素, 因此只要先设LC为空表, 然后将LA或 LB中的元素逐个插入到LC中即可。 为使LC中的元素按值非递减有序排列, 可设两个指针pa 和pb分别指向LA和LB中的某个元素, 若设pa当前所指的元素为 a, pb当前所指的元素为 b, 则当前应插入到LC中的元素 c为: 在这里插入图片描述 显然,指针pa和pb的初值分别指向两个有序表的第一个元素, 在所指元素插入LC之后, 在LA或LB中顺序后移。 根据上述分析,分别给出有序表的顺序存储结构和链式存储结构相应合并算法的实现。

1、有序顺序表的合并

【算法步骤】 1、创建一个表长为m+n的空表LC。 2、指针pc初始化,指向LC的第一个元素。 3、指针pa和pb初始化,分别指向LA和LB的第一个元素。 4、当指针pa和pb均未到达相应表尾时, 则依次比较pa和pb所指向的元素值,从LA或 LB中 "摘取“ 元素值较小的结点插入到LC的最后。 5、如果pb巳到达LB的表尾, 依次将LA的剩余元素插入LC的最后。 6、如果pa已到达LA的表尾, 依次将LB的剩余元素插入LC的最后。

//14、有序顺序表合并 时间O(n + m) 空间O(n + m) void MergeList(SqList LA, SqList LB, SqList &LC) {//已知有序顺序表LA和LB的元素按值非递减排列 //归并LA和LB得到新的有序顺序表LC,LC的元素也按值非递减排列 LC.length = LA.length + LB.length; //新表长度为待合并量表的长度之和 LC.elem = new ElemType[LC.length]; //为合并后的信标分配一个数组空间 ElemType *pc = LC.elem, *pa = LA.elem, *pb = LB.elem; //指针均指向表的第一个元素 ElemType *pa_last = LA.elem + LA.length - 1; //指向LA的最后一个元素 ElemType *pb_last = LB.elem + LB.length - 1; //指向LB的最后一个元素 while(pa


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3