简单而又细节的冒泡排序

冒泡排序

例如我要对一个数组中的5个数进行排序:
定义数组a[5]={5,4,3,2,1}

首先将数组中的第一个数和第二个数比较,将最大的数放到第二个,然后将第二个数和第三个数比较,将最大的数放到第三个,然后将第三个数和第四个数进行比较,将最大的数放到第四个,将第四个数与第五个数进行比较,将最大的数放到第五个数。

然后你就会发现第五个数(也就是a[4])是这五个数的最大值。
将最大的数找出来后,然后对前四个数进行类似上面的两两比较,都会将最大的数放到最后一个,这样依次类推,你就会发现每次都会有最大的数沉到下面,也就是所谓的冒泡排序。

用代码实现,前五个数比较将最大数的放到最后一个a[4]上

代码:

   
   int a[5]={5,4,3,2,1};
   //循环次数为4次
   /*
     5和4,4和3,3和2,2和1  加起来总共4次
   */
   for(int i=0;i<4;i++){
        //a[i]和a[i+1]两个数进行交换
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }

    for(int i=0;i<5;i++){
        printf("%2d",a[i]);
    }

结果:

 4 3 2 1 5
Process returned 0 (0x0)   execution time : 0.102 s
Press any key to continue.

然后再将前四个数的最大值放到这四个数的最后一个a[3]上
代码:

    int a[5]={5,4,3,2,1};
    //循环4次
    for(int i=0;i<4;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    //循环3次
    for(int i=0;i<3;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    for(int i=0;i<5;i++){
        printf("%2d",a[i]);
    }

结果:

 3 2 1 4 5
Process returned 0 (0x0)   execution time : 0.061 s
Press any key to continue.

然后再将前三个数的最大值放到这三个数的最后一个a[2]上
代码:

   int a[5]={5,4,3,2,1};
   //循环4次
    for(int i=0;i<4;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    //循环三次
    for(int i=0;i<3;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    //循环两次
    for(int i=0;i<2;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    for(int i=0;i<5;i++){
        printf("%2d",a[i]);
    }
 2 1 3 4 5
Process returned 0 (0x0)   execution time : 0.017 s
Press any key to continue.

然后再将前两个数的最大值放到这两个数的最后一个a[1]上
代码:

    int a[5]={5,4,3,2,1};
    //循环四次
    for(int i=0;i<4;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    //循环三次
    for(int i=0;i<3;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    //循环两次
    for(int i=0;i<2;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    //循环一次
    for(int i=0;i<1;i++){
        if(a[i]>a[i+1]){
            int num=a[i];
            a[i]=a[i+1];
            a[i+1]=num;
        }
    }
    for(int i=0;i<5;i++){
        printf("%2d",a[i]);
    }
 1 2 3 4 5
Process returned 0 (0x0)   execution time : 0.079 s
Press any key to continue.

注意:上面的四个for循环中除了for循环条件,其余都是一样的,也就是说第一个for循环循环4次,第二个for循环共循环三次,第三个for循环共循环两次,第四个for循环共循环一次,

这样我们就可以再次嵌套一个for循环,这个for循环的次数为4,因为代码中总共有4个for循环。

    int a[5]={5,4,3,2,1};
    for(int k=0;k<4;k++){
        for(int i=0;i<4-k;i++){
            if(a[i]>a[i+1]){
                int num=a[i];
                a[i]=a[i+1];
                a[i+1]=num;
            }
        }
    }
    for(int i=0;i<5;i++){
        printf("%2d",a[i]);
    }

结果:

 1 2 3 4 5
Process returned 0 (0x0)   execution time : 0.017 s
Press any key to continue.

代码中用到了4-k,随着每次K++,这样就会形成4,3,2,1次数。

总结:如果是n个数比较大小,外面一层for循环条件就是k=0;k<n-1;k++
里面一层for循环条件就是i=0;i<n-1-k;i++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值