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