1、问题描述
问题描述:
合并两个非递减有序的线性表La和Lb,并使合并成线性表Lc也是非递减有序的。
请编写算法的伪代码。
2、算法原理
在我看来,这个问题的关键就是在插入时如何保证线性表的有序性。
算法:两个线性表同时开始遍历,分别从两表中各取出一个元素,二者进行比较,把小的元素插到新表Lc中,重复此操作直至一个表别取完,接着把那个没取完的表中元素全部插到Lc中,操作完成。
该算法的时间复杂度为:O(ListLength(La)+ListLength(Lb));
注:线性表元素的位序和数组的下标有差异!!!
3、算法伪代码
void MergeList(List La,List Lb,List &Lc) //功能:实现两有序表的合并;
{
InitList(&Lc); //初始化新的线性表Lc;
i=j=1; k=0;
La_Len=ListLength(La); //获得线性表La的长度;
LB_Len=ListLength(Lb); //获得线性表Lb的长度;
while((i<=La_Len)&&(j<=Lb_Len)) //直至两表中的一个表遍历完;
{
GetElem(La,i,&ai); GetElem(Lb,i,&bj); //获取两表中的元素;
if(ai<=bj) //若La中的元素不大于Lb中的元素,把元素ai插到Lc中;
{
ListInsert(Lc,++k,ai); i++; //注:在每次插入之前都要把记录着Lc的长度的变量k加1,再插入;
} //在插入完成后,把计数因子i加1,目的是在下次循环是取出元素ai+1;
else //若Lb中的元素不大于La中的元素,把元素bj插到Lc中;
{
ListInsert(Lc,++k,bj); j++;
}
}
while(i<=La_Len) //表明La中的元素没插完,继续把剩下的元素插完;
{
GetElem(La,i,&ai); //获取线性表La中的元素;
ListInsert(Lc,++k,ai); //将元素ai插到Lc中;
i++; //计数因子i加一;
}
while(i<=Lb_Len) //表明Lb中的元素没插完,继续把剩下的元素插完;
{
GetElem(Lb,i,&bj); //获取线性表Lb中的元素;
ListInsert(Lc,++k,bj); //将元素bj插到Lc中;
j++; //计数因子j加一;
}
} //MergeList;
4、具体C++实现代码
#include<iostream>
using namespace std;
int La[]={2,4,6,8,10,12}; //定义线性表La;
int Lb[]={1,3,5,7,9,11,13,15,17,19}; //定义线性表Lb;
int Lc[100]; //定义线性表Lc,此时Lc是空表;
int La_Len=sizeof(La)/sizeof(La[0]); //获得线性表La的表长;
int Lb_Len=sizeof(Lb)/sizeof(Lb[0]); //获得线性表Lb的表长;
int Lc_Len=0; //定义线性表Lc的表长为0;
int GetElem(int a[],int n) //获得线性表中的元素;
{
return a[n-1]; //返回对应的数组元素值;
}
void ListInsert(int Lc[],int x1) //实现元素的插入操作;
{
Lc[Lc_Len]=x1;
Lc_Len++; //每插入一次,表长加1,为下次插入留下空位;
}
void MergeList(int La[],int Lb[],int Lc[]) //功能:合并两个有序的线性表;
{
int i,j;
i=j=1; //线性表元素的位序,不是数组下标;
while((i<=La_Len)&&(j<=La_Len)) //while循环执行的条件;
{
if(GetElem(La,i)<=GetElem(Lb,j)) //比较ai和bj大小;
{
ListInsert(Lc,GetElem(La,i)); //实现元素的插入;
i++; //为遍历下一个元素作准备;
}
else
{
ListInsert(Lc,GetElem(Lb,j));
j++;
}
}
while(i<=La_Len) //表明线性表La中还有元素,把余下的元素都插到Lc中;
{
ListInsert(Lc,GetElem(La,i));
i++;
}
while(j<=Lb_Len) //表明线性表Lb中还有元素,把余下的元素都插到Lc中;
{
ListInsert(Lc,GetElem(Lb,j));
j++;
}
}
int main()
{
cout<<"La中的元素:";
for(int r=0;r<La_Len;r++)
{
cout<<La[r]<<" ";
}
cout<<endl;
cout<<"Lb中的元素:";
for(int r1=0;r1<Lb_Len;r1++)
{
cout<<Lb[r1]<<" ";
}
cout<<endl;
MergeList(La,Lb,Lc);
cout<<"Lc中的元素:";
for(int r2=0;r2<Lc_Len;r2++)
{
cout<<Lc[r2]<<" ";
}
return 0;
}
5、运行结果
用例一:两表中没有重复元素
运行环境:DEV c++
用例二:两表中含有重复元素
运行环境:DEV c++
至此,整个题目解答完毕!!!
结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家看到结尾。(∩^∩)
奋斗的2351