1. 程式人生 > >【資料結構】-線性表-順序表-1324: 演算法2-2:有序線性表的有序合併

【資料結構】-線性表-順序表-1324: 演算法2-2:有序線性表的有序合併

1324: 演算法2-2:有序線性表的有序合併

題目描述

已知線性表 LA 和 LB 中的資料元素按值非遞減有序排列,現要求將 LA 和 LB 歸併為一個新的線性表 LC, 且 LC 中的資料元素仍然按值非遞減有序排列。例如,設LA=(3,5,8,11) ,LB=(2,6,8,9,11,15,20) 則
LC=(2,3,6,6,8,8,9,11,11,15,20)
演算法描述如下:
從上述問題要求可知,LC中的資料元素或是LA中的資料元素,或是LB中的資料元素,則只要先設LC為空表,然後將LA或LB中的元素逐個插入到LC中即可。為使LC中元素按值非遞減有序排列,可設兩個指標 i 和 j 分別指向LA和LB中某個元素,若設 i 當前所指的元素為 a,j 所指的元素為 b,則當前應插入到 LC 中的元素 c 為 c = a < b ? a : b顯然,指標 i 和 j 的初值均為1(實際寫程式碼時往往是從 0 開始的),在所指元素插入 LC 之後,在 LA 或者 LB 中順序後移。

輸入

有多組測試資料,每組測試資料佔兩行。第一行是集合A,第一個整數m(0<=m<=100)代表集合A起始有m個元素,後面有m個非遞減排序的整數,代表A中的元素。第二行是集合B,第一個整數n(0<=n<=100)代表集合B起始有n個元素,後面有n個非遞減排序的整數,代表B中的元素。每行中整數之間用一個空格隔開。

輸出

每組測試資料只要求輸出一行,這一行含有 m+n 個來自集合 A 和集合B 中的元素。結果依舊是非遞減的。每個整數間用一個空格隔開。

樣例輸入

4 3 5 8 11
7 2 6 8 9 11 15 20

樣例輸出

2 3 5 6 8 8 9 11 11 15 20

提示

本題書中提供的演算法是基於順序表的。在使用順序表時需要兩倍於資料元素數目。如果使用連結串列則只需要儲存一倍的元素。然而使用連結串列同樣需要儲存一倍的指標。所以對於這類問題資料結構的選取,如果資料域佔用的空間很大則可以使用連結串列儲存來節省空間,而對於資料域佔用不大的情況,則使用順序表也可以。

#include<stdio.h>
typedef int ElemType;
typedef struct
{
    int data[205];
    int length;
}List;
List MergeList(List La,List Lb,List &Lc);
void
ListInsert(List &A,int length,ElemType e); int main(void) { int n,m; List La,Lb,Lc; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d",&La.data[i]); } scanf("%d",&m); for(int i=0;i<m;i++) { scanf("%d",&Lb.data[i]); } La.length=n; Lb.length=m; Lc.length=0; MergeList(La,Lb,Lc); for(int i=1;i<=Lc.length;i++) { if(i==1) { printf("%d",Lc.data[i]); } else { printf(" %d",Lc.data[i]); } } printf("\n"); } return 0; } List MergeList(List La,List Lb,List &Lc) { int La_len = La.length; int Lb_len = Lb.length; int Lc_len = Lc.length; int i=0,j=0; while((i<La_len)&&(j<Lb_len))//連結串列的資料都不為空時 { if(La.data[i]<=Lb.data[j]) { ListInsert(Lc,++Lc_len,La.data[i]); ++i; } else { ListInsert(Lc,++Lc_len,Lb.data[j]); ++j; } } while(i<La_len)//當La沒插入完成而Lb全部插完了。繼續插入La { ListInsert(Lc,++Lc_len,La.data[i]); ++i; } while(j<Lb_len)//當Lb沒插入完成而La全部插完了。繼續插入Lb { ListInsert(Lc,++Lc_len,Lb.data[j]); j++; } } void ListInsert(List &A,int length,ElemType e) { A.data[length]=e; ++(A.length); }