两个有序线性表合成一个有序表(算法伪代码+具体C++实现代码)

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

发布了13 篇原创文章 · 获赞 3 · 访问量 748

猜你喜欢

转载自blog.csdn.net/weixin_45620022/article/details/105164298