A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一曲繁华尽 中级黑马   /  2015-11-8 21:13  /  775 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

教程中老师使用双层FOR循环进行冒泡排序不论原数据如何排列,循环次数是固定的也就是说对于一个任意顺序的数组,该循环的循环次数即是完成排序需要的最大次数 。
  1. //
  2. //  main.c
  3. //  双层循环冒泡排序
  4. //
  5. //  Created by mac on 15/11/8.
  6. //  Copyright © 2015年 zhaoxin. All rights reserved.
  7. //

  8. #include <stdio.h>

  9. int main(int argc, const char * argv[]) {
  10.     //定义一个数组
  11.     int a[10];
  12.     for(int i = 0;i<10;i++){
  13.         printf("给a[%d]赋值为:",i);
  14.         scanf("%d",&a[i]);
  15.     }
  16.    
  17.     //获取数组内容
  18.    
  19.     for(int i = 0;i<10;i++){
  20.         printf("a[%d] = %d\n",i,a[i]);
  21.         
  22.         
  23.     }
  24. //冒泡排序
  25.     int temp,k = 0;
  26.     for(int i = 0;i<9;i++){
  27.         
  28.         for(int j = 0;j<9-i;j++){
  29.             k++;
  30.             if(a[j]>a[j+1]){
  31.             temp = a[j];
  32.             a[j] = a[j+1];
  33.                 a[j+1] = temp;}
  34.         }
  35.     }
  36.    
  37.    
  38.     printf("共进行%d次循环",k);
  39.     for(int r;r<10;r++){
  40.         printf("\n结果为%d\t",a[r]);
  41.     }
  42.    
  43.    
  44.     return 0;
  45.     }
复制代码


对该代码可以进行优化只使用一次FOR循环并且如果原数组中有正确排序的数字则不需要进行多余的循环。减少了循环的次数。
  1. //
  2. //  main.c
  3. //  冒泡排序
  4. //
  5. //  Created by mac on 15/11/8.
  6. //  Copyright © 2015年 zhaoxin. All rights reserved.
  7. //

  8. #include <stdio.h>

  9. int main(int argc, const char * argv[]) {
  10.     //定义一个数组
  11.     int a[10];
  12.     for(int i = 0;i<10;i++){
  13.         printf("给a[%d]赋值为:",i);
  14.         scanf("%d",&a[i]);
  15.     }

  16.     //获取数组内容
  17.    
  18.     for(int i = 0;i<10;i++){
  19.         printf("a[%d] = %d\n",i,a[i]);
  20.    
  21.    
  22.     }
  23.     //冒泡排序
  24.     int k = 0;
  25.     for(int i = 0;i<9;){
  26.         printf("第%D次循环",k);
  27.         k++;
  28.         int j=0;
  29.         //判断如果是a[i]<=a[i+1]则不动二者位置,如果a[i]>a[i+1]则交换位置后向上两位继续比较
  30.         if(a[i]<=a[i+1]){
  31.             i++;
  32.         }else{
  33.             j = a[i];
  34.             a[i] = a[i+1];
  35.             a[i+1] = j;
  36.             i--;
  37.         }
  38.     }
  39.     for(int i = 0;i<10;i++ ){
  40.                          printf("结果a[%d] = %d\n",i,a[i]);
  41.         
  42.      
  43.     }
  44.     return 0;
  45. }
复制代码

当然 如果是次序很乱的话 该代码的执行次数是要比双层循环多的
在这个情况下就不那么算的上是优化了。

屏幕快照 2015-11-08 21.05.10.png (81.38 KB, 下载次数: 12)

屏幕快照 2015-11-08 21.05.10.png

屏幕快照 2015-11-08 21.09.26.png (83.26 KB, 下载次数: 13)

屏幕快照 2015-11-08 21.09.26.png

屏幕快照 2015-11-08 21.11.23.png (84.67 KB, 下载次数: 37)

屏幕快照 2015-11-08 21.11.23.png

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马