鱼C论坛

 找回密码
 立即注册
查看: 1630|回复: 8

想输出的最小数,结果为什么是最大数

[复制链接]
发表于 2015-9-14 11:42:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
void main()
{        int c[5];
        int i,j,k;
int a[3][3]={1,2,3,4,5,6,7,8,9};        



        for(i=0;i<3;i++)/*求矩阵中每行的最小数*/
        {for(j=0;j<2;j++)
                        if(a[i][j]>a[i][j+1])
                        {k=a[i][j+1];a[i][j+1]=a[i][j];a[i][j]=k;}
                        c[i]=a[i][j];}/*把最小数赋给数组c*/

        for(i=0;i<3;i++)/*输出数组c*/
        printf("%d",c[i]);
                
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-14 11:52:35 | 显示全部楼层
看的的代码好不爽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-16 13:57:47 | 显示全部楼层
for(i=0;i<3;i++)/*求矩阵中每行的最小数*/

10.        {for(j=0;j<2;j++)

11.                        if(a[i][j]>a[i][j+1])

12.                        {k=a[i][j+1];a[i][j+1]=a[i][j];a[i][j]=k;}

这部分代码是利用冒泡把每行最大的值放到了最后边,循环结束后第一次循环结束后i=0,j=2,所以你把第一行的最后一个值赋给了c[0],同理你把每行最后一个值(也就是每行的最大值)赋给了c,当然取出的是最大值。相反你改成 if(a[i][j]<a[i][j+1])就会把每行的最小值放到每行最后,其他代码不变就可以得到每行最小值了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2015-9-16 15:58:42 | 显示全部楼层
本帖最后由 yywryywr 于 2015-9-16 16:08 编辑


这是冒泡排序???
首先逻辑就错了,比如  1 2 3这三个数,在里面比较的时候是这样的:

我们看代码的第一次内层循环是怎么执行的
首先 1和2比,不交换(按LZ的代码来)( 这时j=0)
然后j++,2和3比,不交换(这时j=1)
然后再j++ ,j=2,跳出循环
此时k=a[ ,i ][j] == a[,i,][1]==2 ,(是的,j这个时候是1哦,不是0 )

所以LZ的代码结果应该是2,5,8

列外冒泡排序是种方法,到底小的数放前面还是放后面还不是看自己喜欢和需求
下面是我改的LZ的代码,供参考
#include<stdio.h>
void main()
{
        int c[5];
        int i,j,k;
        int temp=0;//temp用来存放目前已知的最小的值
        int a[3][3]={1,2,3,4,5,6,7,8,9};        

        for(i=0;i<3;i++)//求矩阵中每行的最小数
        {
                for(j=0;j<2;j++)
                {
                        for (k=j+1;k<3;k++)
                        {
                                if (a[i][j]>a[i][k])
                                {
                                        temp=a[i][k];
                                        a[i][k]=a[i][j];
                                        a[i][j]=temp;//把最小的值放到a[i][j]
                                }
                        }

                }
                c[i]=a[i][0];//这里不是a[i][j],因为循环完毕后j
        }
        for(i=0;i<3;i++)//输出数组c
        {
                printf("%d\n",c[i]);
        }
}

冒泡排序的三种方法,也共参考
http://www.jb51.net/article/42052.htm

最后,LZ不要省空间,真是好难看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-16 16:07:01 | 显示全部楼层
循环比较你只是前后相连的两个比较,这样循环是没办法把最小的值循环放到最前面去的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-17 10:31:39 | 显示全部楼层
yywryywr 发表于 2015-9-16 16:07
循环比较你只是前后相连的两个比较,这样循环是没办法把最小的值循环放到最前面去的

冒泡法就是循环比较前后两个比较啊,把最大的或是最小的冒泡到最头或是最末尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-17 10:44:04 | 显示全部楼层
yywryywr 发表于 2015-9-16 15:58
这是冒泡排序???
首先逻辑就错了,比如  1 2 3这三个数,在里面比较的时候是这样的:

为什么不是冒泡,只是只进行了一次循环而已,不算完整的冒泡排序,但是他要的只是最小值,进行一次就够了,没必要把整个数组排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-17 22:18:07 | 显示全部楼层
qq小小七 发表于 2015-9-17 10:44
为什么不是冒泡,只是只进行了一次循环而已,不算完整的冒泡排序,但是他要的只是最小值,进行一次就够了 ...

抱歉,你是对的,我跟列外一种冒泡排序写法弄混了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-18 18:45:51 | 显示全部楼层
好难看懂。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表