注册 登录
编程论坛 C语言论坛

为什么比较的顺序不同结果不同???

新手714 发布于 2020-05-22 12:12, 3209 次点击
#include<stdio.h>
struct student
{
    int number;
    char name[7];
    float score;
};
int main()
{
    struct student stu[5] = { {01,"GY",97},{02,"Yoo",87},{03,"Gong",87.7},{04,"shacha",97.7},{05,"erzi",77} };
    struct student t;
    int i, j, k;
    for (i = 3; i >=0; i--)                                                  //
    {
        k = i;                                                            这
        for (j = i + 1; j >0; j--)
        {
            if (stu[k].score < stu[j].score)                          部
                k = j;
            t = stu[i]; stu[i] = stu[k]; stu[k] = t;                  分
        }                                                      
    }                                                                         //
    for (i = 0; i < 5; i++)
        printf("%6d %8s %6.2f\n", stu[i].number, stu[i].name, stu[i].score);
    return 0;
}
而下面这样就不同了

for (i = 0; i <4; i++)
    {
        k = i;
        for (j = i + 1; j <5; j++)
        {
            if (stu[k].score < stu[j].score)
                k = j;
            t = stu[i]; stu[i] = stu[k]; stu[k] = t;
        }
    }




或者以下两种,为什么结果不同???
for (i = 0; i <4; i++)
    {
        k = i;
        for (j = i + 1; j <5; j++)
        {
            if (stu[j].score >stu[k].score)
                k = j;
            t = stu[i]; stu[i] = stu[k]; stu[k] = t;
        }
    }

for (i = 0; i <4; i++)
    {
        k = i;
        for (j = i + 1; j <5; j++)
        {
            if (stu[k].score < stu[j].score)
                k = j;
            t = stu[i]; stu[i] = stu[k]; stu[k] = t;
        }
    }
12 回复
#2
fulltimelink2020-05-22 14:25
把交换拿到内循环的外面
程序代码:

for (i = 0; i < 4; i++)
    {
        k = i;
        for (j = i + 1; j < 5; j++)
        {
            if (stu[k].score < stu[j].score)
                k = j;
            
        }
        t = stu[i]; stu[i] = stu[k]; stu[k] = t;
    }

没有必要每次都交换, 况且你的交换无论if啥结果 都交换。。。
#3
新手7142020-05-22 16:53
回复 2楼 fulltimelink
为什么要k=i??
#4
fulltimelink2020-05-22 17:44
回复 3楼 新手714
因为0-i的已经是按从小到大的顺序排列了,所以k从i开始标识出来目前剩下的哪个是最小的,然后和i交换
#5
新手7142020-05-22 18:06
回复 4楼 fulltimelink
不赋值的话为什么不行
#6
fulltimelink2020-05-22 18:40
回复 5楼 新手714
因为你下面使用了,所以你得先赋值。。。。你去银行存钱,银行不从你余额(初始值)而是从0元上给你加钱,你也不愿意不是?
#7
新手7142020-05-22 20:08
回复 6楼 fulltimelink
不是。
为什么
    for (i = 3; i >=0; i--)
    {
        for (j = i + 1; j >0; j--)
            if (stu[i].score < stu[j].score)
            {
                t = stu[i]; stu[i] = stu[j]; stu[j] = t;
            }
    }
这样不行?
#8
fulltimelink2020-05-22 22:41
回复 7楼 新手714
因为不能保证stu[4]是最大的,比如97      87       87.7       96     88
#9
新手7142020-05-22 23:04
回复 8楼 fulltimelink
不对,发错了
for (i = 4; i >=0; i--)
    {
        for (j = i -1; j >0; j--)
            if (stu[i].score >stu[j].score)
            {
                t = stu[i]; stu[i] = stu[j]; stu[j] = t;
            }
    }
我就拿你写的例子写了一遍下来是没问题,但是电脑不行
         j i
   5 1 3 4 2
(1)5 1 3 4 2
(2)5 2 3 4 1
(3)5 2 4 3 1
(4)5 3 4 2 1
(5)5 4 3 2 1
#10
wmf20142020-05-22 23:15
回复 9楼 新手714
这样写,当i=1时,j=i-1=0,不满足内循环条件,最前面的两个数未参与比较,修改如下可行:
程序代码:
    for (i = 4; i > 0; i--)
    {
        for (j = i - 1; j >= 0; j--)
            if (stu[i].score > stu[j].score)
            {
                t = stu[i]; stu[i] = stu[j]; stu[j] = t;
            }
    }
#11
fulltimelink2020-05-23 13:53
回复 9楼 新手714
我没有在if里面交换啊,你为啥非要在内循环里面交换呢
#12
新手7142020-05-23 15:10
回复 10楼 wmf2014
!!!感觉自己蠢,拜谢拜谢
#13
新手7142020-05-23 15:14
回复 11楼 fulltimelink
俺不想再赋值呐,拜谢拜谢!
1