2.3线性表顺序结构应用举例及小结
【顺序表应用举例】有序表合并问题
下面来看合并算法的要求。有两个顺序表 LA 和 LB,其元素均为递
增有序排列,编写一个算法,将它们合并成一个递增有序顺序表 LC。
例如一个表是(1, 3, 5), 另一个表是(2,4,6)将他们合并成表(1, 2, 3, 4, 5,
6)。
【算法思想】
- 初始化:LC 为空表,设 LC 表的指示器 k=0 设两个指示器 i,j 分别指向表 LA 和 LB 的当前位置,初值均为 0。
- 比较循环:LA 表和 LB 表的当前元素比较,小的元素进 LC 表,且该表的指示器和 LC 表的指示器 k 均加 1移向下一个位置。如此下去,直到 LA 或 LB 表中一个表处理完毕为止。
- 复制循环:将未处理完的表中剩余元素通过循环逐一复制到 LC 表中。
【算法描述】
void merge(SeqList *LA, SeqList *LB, SeqList *LC)
{
int i,j,k,l;
i=0;j=0;k=0;
while(i<=LA->last&&j<=LB->last)
if(LA->elem[i]<=LB->elem[j])
{
LC->elem[k]= LA->elem[i];
i++; k++;
}
else
{
LC->elem[k]=LB->elem[j];
j++; k++;
}
while(i<=LA->last) /*当表 LA 有剩余元素时,则将表 LA 余下的元素赋给表 LC*/
{
LC->elem[k]= LA->elem[i];
i++; k++;
}
while(j<=LB->last) /*当表 LB 有剩余元素时,则将表 LB 余下的元素赋给表 LC*/
{
LC->elem[k]= LB->elem[j];
j++; k++;
}
LC->last=LA->last+LB->last+1;
}
【算法分析】由于两个待归并的表 LA、LB 本身就是有序表,且表 LC 的建立采用的是尾插法建表,插入时不需要移动元素,所以算法的时间复杂度 O(LA->last+LB->last)。
有序表合并算法包括了对线性表的定位、比较、移动等线性表基本运算的组合。只要掌握了基本操作就可以应对实际问题的变化需求。
【顺序存储结构的优缺点分析】
线性表顺序表示的优点是:
- 无需为表示结点间的逻辑关系而增加额外的存储空间。
- 可方便的随机存取表中的任一元素。
缺点: - 插入或删除运算需要移动大量的结点,效率低下。
- 由于顺序表存储分配静态分配。当表长变化较大难以确定合适的存储规模。