十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
你没有规定sort()用什么排序方式,我用的冒泡。
创新互联成立与2013年,是专业互联网技术服务公司,拥有项目网站设计、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元吉首做网站,已为上家服务,为吉首各地企业和个人服务,联系电话:18982081108
没有什么注释先道个歉。
不知道你要这个程序是做什么的,计算机专业还是随便玩玩,如果是专业的这种基础算法一定要掌握。
#includestdio.h
void arrayio(int a[], int n,char io);
void sort(int a[],int n);
void merger(int a[], int n, int b[], int m, int c[]);
int main()
{
int a[5],b[10],c[15];
printf("Input Array a[5]:\n");
arrayio(a,5,'i');
printf("Input Array b[10]:\n");
arrayio(b,10,'i');
sort(a,5);
sort(b,10);
merger(a,5,b,10,c);
printf("Output Array c[15]:\n");
arrayio(c,15,'o');
//system("PAUSE");
return 0;
}
void arrayio(int a[], int n,char io)
{
int i;
switch(io)
{
case 'i':
for(i=0;in;++i) scanf("%d",a[i]);
break;
case 'o':
for(i=0;in;++i) printf("%d ",a[i]);
printf("\n");
break;
default:
printf("Wrong parameter.\n");
}
}
void sort(int a[],int n)
{
int i,j,temp;
//Bubble
for(i=0;in-1;i++)
for(j=i+1;jn;j++)
{
if(a[i]a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
void merger(int a[], int n, int b[], int m, int c[])
{
int i,j,k;
i=j=0;
for(k=0;km+n;k++)
{
if(in jm)
{
if(a[i]b[j])
{
c[k]=b[j];
j++;
}
else
{
c[k]=a[i];
i++;
}
}
else if(i==n)
{
for(;jm;j++)
{
c[k]=b[j];
k++;
}
}
else //j==m
{
for(;in;i++)
{
c[k]=a[i];
k++;
}
}
}
}
输入输出:
Input Array a[5]:
9 1 4 2 5
Input Array b[10]:
8 3 6 4 7 2 9 8 5 3 4
Output Array c[15]:
1 2 2 3 3 4 4 5 5 6 7 8 8 9 9
merge()是C++标准库的函数,主要实现函数的排序和合并,不仅仅是合并,具体要求参照标准库。
#include"stdafx.h"
#includeiostream
#includealgorithm
#includearray
#includelist
usingnamespacestd;
boolcomp(constinti,constintj){
returnij;
}
intmain(void){
/*自定义谓词*/
std::arrayint,4ai1={1,3,4,5};
std::listintlsti1;
for(constautoi:ai1)
lsti1.push_front(i);//从大到小
std::arrayint,4ai2={2,6,7,8};
std::listintlsti2;
for(constautoi:ai2)
lsti2.push_front(i);
lsti1.merge(lsti2,comp);
std::cout"merge():";
for(constautoi:lsti1)
std::couti"";
std::coutstd::endl;
/*默认谓词*/
std::arrayint,4ai1d={1,3,4,5};
std::listintlsti1d;
for(constautoi:ai1d)
lsti1d.push_back(i);//从小到大
std::arrayint,4ai2d={2,6,7,8};
std::listintlsti2d;
for(constautoi:ai2d)
lsti2d.push_back(i);
lsti1d.merge(lsti2d);
std::cout"merge():";
for(constautoi:lsti1d)
std::couti"";
std::coutstd::endl;
return0;
}
扩展资料
Merge算法的两种接口,把两个有序的数组合并到另一个数组中:
void Merge(int *A, int f, int m, int e){
int temp[e-f+1];
int i,first=f,last=m+1;
for(i=0;i(e-first+1)f=mlast=e;i++){
if(A[f]=A[last]) {
temp[i]=A[f];
f++;
}
else {
temp[i]=A[last];
last++;
}
}
while(fmlast=e){
temp[i]=A[last];
i++;
last++;
}
while(f=mlaste){
temp[i]=A[f];
i++;
f++;
}
for(i=0;first=e;i++,first++){
A[first]=temp[i];
}
}
参考资料来源:百度百科—c语言
/**设个有序关键字表s1=(18,25,37,42),s2=(20,33,40).同时将s1,s2存储在数组r[1...7]中
**s1放r[1..4],s2放[5..7],现要归并到一维数组r2[1..7]中,只要依次比较这两个有序
**表中相应记录关键字,按取小原则复制到r2中
**/
#includestdio.h
#define MAXITEM 100
typedef struct rec
{
int key;
char data[20];
}elemnode[MAXITEM];
void merge(elemnode r,elemnode r1,int l,int m,int h)
{ // i,j是r的指示器,i的取值从l到m, j的取值从m+1到h,k是r1的指示器
int i = l,j = m+1,k = l;
while(i=m j=h)
{
if(r[i].key=r[j].key)
{
r1[k] = r[i];
i++;
}
else
{
r1[k] = r[j];j++;
}
k++;
}
if(im)
while(j=h)
{
r1[k] = r[j];
j++;
k++;
}
else
while(i=m)
{
r1[k] = r[i];
i++;
k++;
}
}
void mergepass(elemnode r,elemnode r1,int n,int l)
{
//将r中长度为L的两个部分合并,第一部分从p到期(p+l-1)
//第二部分从 p+1到(p+2*l-1)
int p = 1;
while(n-p+12*l)
{
merge(r,r1,p,p+l-1,p+2*l-1);
p+=2*l; //p向后移动2*l,准备下一次合并
}
if(n-p+1l) //一个长度为l的部分与一个长度小于l的部分合并
merge(r,r1,p,p+l-1,n);
else //只剩下一个长度不大于l的部分,将其复制到r1
for(;p=n;p++) r1[p] = r[p];
}
void mergesort(elemnode r,elemnode r1,int n)
{//对r中数据元素进行归并,结果仍放在r 中
int l = 1;
while(ln)
{
mergepass(r,r1,n,l);l*=2;
mergepass(r1,r,n,l);l*=2;
}
}
void disp(elemnode r,int n)
{
int i;
for(i=1;i=n;i++)
printf("%6d",r[i].key);
printf("\n");
for(i=1;i=n;i++)
printf("%6s",r[i].data);
printf("\n");
}
void main()
{
elemnode s = {{0," "},{75,"王华"},{87,"李英"},{68,"张萍"},{92,"陈涛"},{88,"刘丽"},{61,"章强"},
{77,"孙军"},{96,"朱斌"},{80,"许伟"},{72,"曾亚"}};
elemnode s1;
int n = 10;
mergesort(s,s1,n);
disp(s,n);
}