美文网首页
诡异冒泡

诡异冒泡

作者: _return_ | 来源:发表于2017-12-30 20:02 被阅读21次

有一天,我漫不经心的为C语言考试备考,看到小伙伴给我发来这样一道题:

从键盘上输入两组整数,每组包含5个整数,使第一组整数按照从大到小的顺序排列,第二组按照从小到大顺序排列。

很简单对吧,反正也不会什么高级的排序,那就冒泡排序吧,我那么懒,就想着直接写一个冒泡排序,再复制一遍不就行了,于是我的代码是这样的:

#include<stdio.h>
int main()
{
    int i,j,t;
    int a[5],b[5];
    for(i=0;i<=4;i++)
    {
        scanf("%d",&a[i]);   //输入第1个数组
    }
    for(i=0;i<=4;i++)
    {
    scanf("%d",&b[i]);       //输入第2个数组
    }       
//int a[5]={1,2,3,4,5};     //这是为了调试查看方便而直接赋值的
//int b[5]={1,2,3,4,5};

    for(i=0;i<5;i++)    // 第2次冒泡
    for(j=0;j<5;j++)
    {
        if(a[j]<a[j+1])    //升序交换
        {
            t=a[j];
            a[j]=a[j+1];
            a[j+1]=t;           
        }       
    }       

    for(i=0;i<5;i++)        //第二次冒泡
    for(j=0;j<5;j++)
    {
        if(b[j]>b[j+1])
        {
            t=b[j];      //  降序交换
            b[j]=b[j+1];
            b[j+1]=t;           
        }       
    }   
    for(i=0;i<5;i++)
    printf("%d ",a[i]);  //输出第一个数组
    printf("\n");
    
    for(i=0;i<5;i++)
    printf("%d ",b[i]);  // 输出第二个数组(错的)
//  printf("%d ",b[i+1]);   //输出第二个数组(对的)
    return 0;
 } 



看似毫无问题吧,除了在for循环里多排了几遍。
(因为我懒得去记怎么优化,反正就这几个数还是没问题的)。

可是在输出时却遇到了问题,如图,b在递增里,原本应该是1 2 3 4 5的,却变成了0 1 2 3 4


冒泡错.png

我猜着去把printf("%d ",b[i]);换成了printf("%d ",b[i+1]);

没想到这样却可以正常输出了,变成了我想要的:

5 4 3 2 1
1 2 3 4 5

讲道理不管是输入还是输出,我的数组b都是从0开始的,而我赋值时,b[0]就是1呀。

于是我在循环前输出了b[0],输出结果的确是1
可是循环之后就变成了0,那就说明是循环的问题,可是循环里,我又重新使i,j归零了呀。
我就干脆多输出了几组循环之后 b的相关数据:

b[0]==0, b[-1]==0 ,b[6]越界,输出地址,i==5.找不到问题所在

带着这个疑惑,我请教了木子。他说冒泡这里好像有个什么问题,要是他就不会定义两个数组,而是再把第一个数组覆盖掉,再录入一遍。
....
似乎并没有少那么几行代码...
这是他的思路:

#include<stdio.h>
int main()
{
    int i,j,t;
    int a[5];
    for(i=0;i<=4;i++)
    {
        scanf("%d",&a[i]);  //录入数组元素 5 个
    }
    for(i=0;i<5;i++)       //第一次冒泡 
    for(j=0;j<5;j++)
    {
        if(a[j]<a[j+1])    //这是降序 
        {
            t=a[j];
            a[j]=a[j+1];
            a[j+1]=t;           
        }       
    }   
        for(i=0;i<5;i++)
    printf("%d ",a[i]);     //输出降序 
    printf("\n");
        
        for(i=0;i<=4;i++)
    {
        scanf("%d",&a[i]);    //覆盖输入 
    }
    for(i=0;i<5;i++)       //第二次冒泡 
    for(j=0;j<5;j++)
    {
        if(a[j]>a[j+1])    //升序 
        {
        t=a[j];
        a[j]=a[j+1];
        a[j+1]=t;           
        }       
    }       
    for(i=0;i<5;i++)
    printf("%d ",a[i]);   //输出 
    return 0;
 } 

当然,从功能上是没问题的,除了有那么一点点的不合题目规定,但是凭什么他的这样就没有问题。

于是我找到了社长请教,我们听听社长怎么说

相关文章

  • 诡异冒泡

    有一天,我漫不经心的为C语言考试备考,看到小伙伴给我发来这样一道题: 从键盘上输入两组整数,每组包含5个整数,使第...

  • 每当我更新一次,就会少一个人......

    诡异啊!不,心痛啊! 每当我更新一次公众号,我的关注人数就会往下掉!! 但是该更新还要更新,该冒泡还要冒泡,该求关...

  • 算法-冒泡排序

    算 法:冒泡排序算法时间复杂度: 冒泡排序算法概述 冒泡排序伪代码 冒泡排序实现 冒泡排序算法概述 冒泡排...

  • 微信小程序中bind和catch的区别

    bindtap 冒泡事件,事件绑定不会阻止冒泡事件向上冒泡catchtap 非冒泡事件, 事件绑定阻止冒泡事件...

  • 事件绑定 和 方法传值

    冒泡和非冒泡事件绑定 bindtap: 冒泡事件绑定 catchtap: 非冒泡事件绑定当其他的事件冒泡到当前元素...

  • 《老姚的热血青春》:吊杠篇

    老姚让每个人带上两根背包绳,冒泡想不通,问到:为什么要带两根背包绳呢?老姚诡异的笑道:一根绑手,一根绑脚!冒...

  • 『连载目录』

    第一章 诡异命案1诡异命案2诡异命案3诡异命案4

  • 随笔:诡异诡异

    我敢说,这两天最爽的,便是北京警方出手迅捷,七天里,查处了三家弄虚作假的检测机构。或许是巧合,但巧合的诡异...

  • JS调试代码方向

    事件冒泡 - 阻止冒泡

  • wepy基础知识

    1、bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。https://deve...

网友评论

      本文标题:诡异冒泡

      本文链接:https://www.haomeiwen.com/subject/nneawxtx.html