兩個有序線性表合成一個有序表(算法僞代碼+具體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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章