为什么是升序而不是降序

来源:6-12 综合练习

Hc丶

2015-11-01 15:28

#include <stdio.h>
int main()
{
    int score[10]={67,98,75,63,82,79,81,91,66,84};
    int m=0,j=0,sum=0;
    for(m=0;m<10;m++)
    {
        for(j=0;j<10;j++)
        {
            if(score[m]<score[j])
            {
                sum=score[j];
                score[j]=score[m];
                score[m]=sum;
               
            }
        }
    }
    for(m=0;m<10;m++)
    {
        printf("score[%d]=%d\n",m,score[m]);
    }
    return 0;
}

这会使得大的在前面,小的在后面啊,哪里错了

写回答 关注

2回答

  • 紫泉
    2015-11-02 09:33:26
    已采纳

    是这样的,比如就3个数字,4 6 5来说,执行是  4 6 5 ——6 4 5——4 6 5——4 5 6. 结果是升序排列的。可是你认为的大的在前面,小的在后面的情况是有前提的:就是小的原先在大的前面,比如 4 6,经过交换编程6 4,是下降的。但是如果是原先是 6 4,经过交换就是4 6 ,就是升序的了。比如4 6 5,第一次外循环,就是4和6交换,变成6 4 5(由于6比5大,不会交换,因为第一次大循环只会交换一次,应该能看懂吧)。但是当第二次大循环时,6和4交换,又变回4 6 5(第二次循环时,由于6比5大,所以不会交换),可见,这2层循环其实是首先让大的往前排,小的在后面,但是轮到后面的进行循环时,就会让前面的比他大的和他进行替换。或者是这样说吧,每次循环保证循环次数的编号的数字的前面都是比该数字小的。比如第一次变成6 4 5,保证6的前面都是比6小的。然后第二次变成4 6 5,保证第二个数6的前面都是比6小的。然后第三次变成4 5 6,保证第三个数6的前面都是比他小的。因此是降序排列。

    Hc丶

    非常感谢!

    2015-11-02 19:55:28

    共 1 条回复 >

  • start_with_C
    2015-11-10 22:22:57

    我有个好方法 把”if(score[m]<score[j])“中的”<“改为”>“  ,可能就正确了,有待验证哦!

    【PS:其实这个for嵌套是有问题的,我没有推演为什么你的程序能排序(其实程序是有问题的),但我很想知道结果,到时候告诉我】


C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926210 学习 · 20797 问题

查看课程

相似问题