这里用数组表示有序表。a[],n,b[],m;假设都是由小到大的,排序后也是由小到大的。结果存于c[],k
这里把相等也当成有序的。
void combine(int a[],int n,int b[],int m,int c[])
{
int i,j;
i=j=0;
k=0;
while(i
if(a[i]else {c[k++]=b[j];j++;}
}
for(;i
Node *ListMerge1(Node *head1,Node *head2)//采用递归的方法实现
{
if(head1==NULL)
return head2;
if(head2==NULL)
return head1;
Node *head=NULL;
if(head1->value < head2->value)
{
head=head1;
head->next=ListMerge1(head1->next,head2);
}
else
{
head=head2;
head->next=ListMerge1(head1,head2->next);
}
return head;
}
#include
#define N 50
int A[N]={0};
int B[N]={0};
int C[N]={0};
void CreateArr(int *a, int len) //创建顺序表
{
printf("请输入%d个整型数据:\n",len);
for(int i=0; i
printf("数据输入完毕.\n");
}
void PrintArr(int *a, int len) //输出顺序表
{
for(int j=0; j
printf("\n");
}
int MergeOder(int *a, int *b, int *c, int lena, int lenb) //合并顺序表
{
int i=0, j=0, k=0; //i控制A数组,j控制B数组,k控制C数组
while(i
if(a[i]<=b[j])
{
c[k] = a[i]; //小的数据先保存到C数组,这里b[j]留到跟a[i++]比较
i++; //当a[i]保存到C时,i要自增
k++; //既然C[k]已经保存了数据了,那么下个保存应当为C[k++];
}
else
{
c[k] = b[j]; //小的数据先保存到C数组,这里a[i]留到跟b[j++]比较
j++; //当b[j]保存到C时,j要自增
k++; //既然C[k]已经保存了数据了,那么下个保存应当为C[k++];
}
}
if(i==lena) //如果先扫描完A数组,也就是i等于lena(当然k也等于lena,但这里不能用k去判断)
{
for(; j
if(j==lenb) //同理
{
for(; i
}
return k;
}
void main()
{
int Arr, Brr, Crr;
printf("请输入A数组的数据个数:");
scanf("%d",&Arr);
CreateArr(A, Arr);
printf("请输入B数组的数据个数:");
scanf("%d",&Brr);
CreateArr(B, Brr);
printf("输出数组A:\n");
PrintArr(A, Arr);
printf("输出数组B:\n");
PrintArr(B, Brr);
Crr=MergeOder(A, B, C, Arr, Brr); //保存C数组的元素个数
printf("输出数组C:\n");
PrintArr(C, Crr);
}
#include "stdio.h"
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int last;
}sqlist;
sqlist creat_Sqlist()
{
sqlist L;
int i=0;
printf("\n输入顺序表:");
scanf("%d",&L.data[i]);
归并排序 强大
楼主人家都写这么好了
写个主函数自己多练练吧