#include "stdio.h"
int d=0 //用于记录数组c的大小,和数组c的输出类的一些操作
void main()
{
int a[50],b[50],c[100]
int i,j,k //i表示a数组的大小 j表示b数组的大小 k用于数组的输出
printf("数组a的输入,输入一个数,表明你要输入多少个数到数组a中\n")
scanf("%d",&i)
for(k=0k<ik++)
scanf("%d",&a[k])
printf("数组b的输入,输入一个数,表明你要输入多少个数到数组b中\n")
scanf("%d",&j)
for(k=0k<jk++)
scanf("%d",&b[k])
void px(int *p,int n) //声明 排序 冒泡法
px(a,i) //调用
px(b,j) //调用
void prin(int *p,int n) //声明 数组的输出函数
prin(a,i)
prin(b,j)
void hb(int *o,int *p,int *q,int m,int n)//声明 两个数组的合并函数 前提:这俩个数组必须是排好序的
hb(c,a,b,i,j)
prin(c,d)
}
void px(int *p,int n) //自定义函数 排序 冒泡法
{int i,j,t,leap
for(i=0i<n-1i++) //外层循环n-1次,一次循环沉淀一个数
{
leap=0 //leap作为标记,是否两数相换
for(j=0j<n-i-1j++) //内循环n-i-1次
{
if(p[j]>p[j+1])//比较两个数
{
t=p[j]
p[j]=p[j+1]
p[j+1]=t //来两个数交换
leap=1//交换了,标记leap=1
}
}
if(leap==0) break //经历了一个内for循环,leap==0的话,表明排序成功了,不需要接下来在排序了。
}
}
void prin(int *p,int n) //自定义函数 数组输出函数
{
int k,sum=0
for(k=0k<nk++)
{
printf("%d ",p[k])
sum++
if(sum%10==0) printf("\n")
}
printf("\n")
}
void hb(int *o,int *p,int *q,int m,int n) //m为p指向数组的大小 n为q指向数组的大小 指针o指向合并的数组
{
int i=0,j=0,k//i为p指向数组的大小 j为q指向数组的大小
while(1)
{
if(p[i]<q[j])
{
o[d]=p[i]
i++
d++
}
else
{
o[d]=q[j]
j++
d++
}
if(i==m||j==n) break
}
if(i==m)
{
for(k=jk<nk++)
{
o[d]=q[k]
d++
}
}
if(j==n)
{
for(k=ik<mk++)
{
o[d]=p[k]
d++
}
}
}
//O(n),完成合并
#include<stdio.h>
int merge(int a[],int b[],int n,int m){//合并两个有序数组
//原理是归并排序的合并阶段
//两个有序数组合并,仍保持有序
int i=0,j=0
int c[100]={0}//存储合并后的数组
int k=0
while(i<n&&j<m){
if(a[i]<b[j]){
c[k++]=a[i++]
}
else{
c[k++]=b[j++]
}
}
while(i<n){
c[k++]=a[i++]
}
while(j<m){
c[k++]=b[j++]
}
for(int i=0i<ki++){
a[i]=c[i]//合并后的数组存入a数组
}
return k//返回合并后的数组长度
}
void print(int a[],int n){//打印数组
for(int i=0i<ni++){
printf("%d ",a[i])
}
printf("\n")
}
int main(){
int a[20]={1,2,3}
int b[20]={4,5,6}
int c[20]={7,8,9}
int len1=3//数组a的长度
int len2=3//数组b的长度
int len3=3//数组c的长度
int len=0//合并数组长度
//经过两次合并
len=merge(a,b,len1,len2)//数组a,b合并,存入数组a
printf("a,b合并\n")
print(a,len)//打印a,b合并结果
len=merge(a,c,len,len3)//数组a,b,c合并,存入数组a
printf("a,b,c合并\n")
print(a,len)//打印a,b,c合并结果
return 0
}