程辅上的问题!谢谢各位大侠能指点!!

xfr_1982 2003-08-24 10:45:56
请教:
函数merge将2个从小到大的有序数组a和b合并成一个新的从小到大的有序数列c,其中形参n和m分别是数组a和b的元素个数!
程序如下:
void merge(int a[],int n,int b[],int m,int *c)
{
int i,j;
i=j=0;
while(i<n && j<m) *c++=a[i]<b[j]?a[i++] : b[j++];
while (i<n) *c++=a[i++];
while (j<m) *c++=b[j++];
}
问题就出在第一个while中,例如有如下的两个生序数组:
n=4 a 1 , 3, 5, 7
m=6 b 2 , 4, 6, 8, 10, 12
用第一个while循环能不能使:
a: 1, 3, 5, 7
b: 2, 4, 6, 8
排序成 c: 1 ,2 , 3, 4, 5, 6, 7, 8 吗??
好象不能呢?是不是清华版的程辅出错了?还是我菜啊!!请大虾出招把!小弟接招了!!!谢谢!非常谢谢!!
请讲仔细点可以?小第会另开给分的!!!
...全文
31 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao2001 2003-08-27
  • 打赏
  • 举报
回复
晕,把我吓一跳,我以为有一阵不写代码就隔屁了呢,原来我没看错~~~汗
cdxiaogan 2003-08-27
  • 打赏
  • 举报
回复
*c++=a[i]<b[j]?a[i++] : b[j++];
if a[i]<b[j],then *c=a[i] ,and do c++,i++
else *c=b[j] , and do c++, j++;
a[i++]就是先对a[i]进行操作,然后i++
关于++ 的问题,你搜索一下以前的多得很
sevecol 2003-08-27
  • 打赏
  • 举报
回复
首先是设置两个游标分别指向两个数组的开始。
然后开始循环,循环的结束的条件是有一个数组遍历完成。
循环中的操作就是根据两个数组的游标取小的一个数据,然后相应的游标++.

上面的这个循环结束后,我们就还剩下一个数组的一部分没有加入到我们的新的数组中。
只需要调用循环将剩下的元素添加就OK了。
xfr_1982 2003-08-27
  • 打赏
  • 举报
回复
各位你们好:
我知道程序是对的!我想请各位高手说说为什么:
n=4 a 1 , 3, 5, 7
m=6 b 2 , 4, 6, 8, 10, 12
用第一个while循环能使:
a: 1, 3, 5, 7
b: 2, 4, 6, 8
排序成 c: 1 ,2 , 3, 4, 5, 6, 7, 8
讲讲其中的道理!谢谢各位!!尤其是其中的i++和j++的含义!!谢谢!小弟会另开帖子给各位大侠送分的!!
cdxiaogan 2003-08-27
  • 打赏
  • 举报
回复
几句伪码就吓楼上的一跳,好笑~~
cdxiaogan 2003-08-26
  • 打赏
  • 举报
回复
清华的没错!
楼主最好先调试调试,在大脑中调试完后要在机器上调试,这样才使正确的学习方法。
楼上的测试程序没错,可以作为证明。

yjh1982(血精灵) 的程序在算法上倒是有问题啊,不知你有没有看懂题意,哈
wbh0360 2003-08-25
  • 打赏
  • 举报
回复
测试代码
void main(){
int a[]={1,3,5,7};
int b[]={2,4,6,8,10,12};
int c[sizeof(a)/sizeof(int)+sizeof(b)/sizeof(int)];
merge(a,sizeof(a)/sizeof(int),b,sizeof(b)/sizeof(int),c);

for(int i=0;i<sizeof(c)/sizeof(int);i++)
printf("%d ",c[i]);
}
wbh0360 2003-08-25
  • 打赏
  • 举报
回复
清华书上的代码ok啊!
怎么回有问题呢?!
我试国了。
cdxiaogan 2003-08-25
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2174/2174579.xml?temp=.5038568
可以参考这个
yjh1982 2003-08-25
  • 打赏
  • 举报
回复
void merge(int a[],int n,int b[],int m,int *c)
{
int i,j;
i=j=0;
while(i<n && j<m) *c++=a[i]<b[j]?a[i++] : b[j++];
while (i<n) *c++=a[i++];
while (j<m) *c++=b[j++];
}
改为
void merge(int a[],int n,int b[],int m,int *c)
{
int i,j;
i=j=0;
while(i<n && j<m)
{
*c++=a[i]<b[j]?a[i++] : b[j++];
while (i<n) *c++=a[i++];
while (j<m) *c++=b[j++];
}
}
清华没好书
sevecol 2003-08-24
  • 打赏
  • 举报
回复
难道不能正确的运行?
xfr_1982 2003-08-24
  • 打赏
  • 举报
回复
试过了!请讲讲道理可以吗?小弟一定重分答谢!!!
sevecol 2003-08-24
  • 打赏
  • 举报
回复
你试过了没有?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧