教程中老师使用双层FOR循环进行冒泡排序不论原数据如何排列,循环次数是固定的也就是说对于一个任意顺序的数组,该循环的循环次数即是完成排序需要的最大次数 。
- //
- // main.c
- // 双层循环冒泡排序
- //
- // Created by mac on 15/11/8.
- // Copyright © 2015年 zhaoxin. All rights reserved.
- //
- #include <stdio.h>
- int main(int argc, const char * argv[]) {
- //定义一个数组
- int a[10];
- for(int i = 0;i<10;i++){
- printf("给a[%d]赋值为:",i);
- scanf("%d",&a[i]);
- }
-
- //获取数组内容
-
- for(int i = 0;i<10;i++){
- printf("a[%d] = %d\n",i,a[i]);
-
-
- }
- //冒泡排序
- int temp,k = 0;
- for(int i = 0;i<9;i++){
-
- for(int j = 0;j<9-i;j++){
- k++;
- if(a[j]>a[j+1]){
- temp = a[j];
- a[j] = a[j+1];
- a[j+1] = temp;}
- }
- }
-
-
- printf("共进行%d次循环",k);
- for(int r;r<10;r++){
- printf("\n结果为%d\t",a[r]);
- }
-
-
- return 0;
- }
复制代码
对该代码可以进行优化只使用一次FOR循环并且如果原数组中有正确排序的数字则不需要进行多余的循环。减少了循环的次数。
- //
- // main.c
- // 冒泡排序
- //
- // Created by mac on 15/11/8.
- // Copyright © 2015年 zhaoxin. All rights reserved.
- //
- #include <stdio.h>
- int main(int argc, const char * argv[]) {
- //定义一个数组
- int a[10];
- for(int i = 0;i<10;i++){
- printf("给a[%d]赋值为:",i);
- scanf("%d",&a[i]);
- }
- //获取数组内容
-
- for(int i = 0;i<10;i++){
- printf("a[%d] = %d\n",i,a[i]);
-
-
- }
- //冒泡排序
- int k = 0;
- for(int i = 0;i<9;){
- printf("第%D次循环",k);
- k++;
- int j=0;
- //判断如果是a[i]<=a[i+1]则不动二者位置,如果a[i]>a[i+1]则交换位置后向上两位继续比较
- if(a[i]<=a[i+1]){
- i++;
- }else{
- j = a[i];
- a[i] = a[i+1];
- a[i+1] = j;
- i--;
- }
- }
- for(int i = 0;i<10;i++ ){
- printf("结果a[%d] = %d\n",i,a[i]);
-
-
- }
- return 0;
- }
复制代码
当然 如果是次序很乱的话 该代码的执行次数是要比双层循环多的
在这个情况下就不那么算的上是优化了。 |
|