(C语言)已知顺序表L1,L2中数据由小到大有序,请用尽可能快的方法将L1与L2中的数据合并到L3中,使数据在L3中按升序排列。
输入样例:
5
2 4 9 10 11
6
1 2 4 6 7 8
输出样例:
1 2 2 4 4 6 7 8 9 10 11
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElementType;
typedef struct LNode{
ElementType data[MAXSIZE];
int Last; /* 保存线性表中最后一个元素所在的位置,初始值为-1 */
}*List;
void merge(List L1,List L2,List L3);
List MakeEmpty(); //顺序表初始化
void createList(List L); //输入顺序表
void print(List L); //输出顺序表
int main()
{
List L1,L2,L3; /*定义顺序表*/
L1=MakeEmpty(); //初始化顺序表
L2=MakeEmpty(); //初始化顺序表
L3=MakeEmpty(); //初始化顺序表
createList(L1); /*输入L1*/
createList(L2); /*输入L2*/
merge (L1,L2,L3); /*L1,L2合并到L3中*/
print(L3); /*输出新表L3*/
}
List MakeEmpty(){//创建一个顺序表
List l;
l=(List)malloc(sizeof(struct LNode));
l->Last=-1;//记录其最后一个元素
return l;
}
void createList(List L)
{ ElementType x;
int N;
scanf("%d",&N);//输入链表元素
while (N--)
{ scanf("%d",&x);
L->Last++;//因为last初始化为-1,数组元素要从1开始,所以先加1
L->data[L->Last]=x;
}
}
void print(List L)//输出链表
{ int i;
for (i=0;i<=L->Last;i++)
{printf("%d ",L->data[i]); }
if (L->Last<0) printf("Empty");
}
void merge(List L1,List L2,List L3){//L1和L2都是从小到大有序的
//先插入再排序
int i,j,t,k;
for(i=0;i<=L1->Last;i++){
L3->Last++;
L3->data[i]=L1->data[i];
}
for(j=0,k=L1->Last+1;j<=L2->Last;j++,k++){
L3->Last++;
L3->data[k]=L2->data[j];
}
for(i=0;i<=(L1->Last+L2->Last)-1;i++){//控制排序次数
for(j=0;j<=(L1->Last+L2->Last)-i;j++){
if(L3->data[j]>L3->data[j+1]){
t=L3->data[j];
L3->data[j]=L3->data[j+1];
L3->data[j+1]=t;
}
}
}
//printf("%d %d\n",L1->Last,L2->Last);
}
运行结果截图