冒泡排序法以及优化后的排序算法

    #include <stdio.h>
    int main()
    {
        int nums[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
        int i, j,k, temp;
        //冒泡排序算法:进行 n-1 轮比较
        for(i=0; i<10-1; i++)
        {
            //每一轮比较前 n-1-i 个,也就是说,已经排序好的最后 i 个不用比较
            for(j=0; j<10-1-i; j++)
            {
                if(nums[j] > nums[j+1])
                {
                    temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
                printf("\n");
                for(k=0; k<10; k++)
                {
                    printf("%d ", nums[k]);
                }

            }
        }
        printf("\n\n");
        for(i=0; i<10; i++){
        printf("%d ", nums[i]);
        }
        printf("\n");

        return 0;
    }

 

执行结果

9 10 8 7 6 5 4 3 2 1 
9 8 10 7 6 5 4 3 2 1 
9 8 7 10 6 5 4 3 2 1 
9 8 7 6 10 5 4 3 2 1 
9 8 7 6 5 10 4 3 2 1 
9 8 7 6 5 4 10 3 2 1 
9 8 7 6 5 4 3 10 2 1 
9 8 7 6 5 4 3 2 10 1 
9 8 7 6 5 4 3 2 1 10 
8 9 7 6 5 4 3 2 1 10 
8 7 9 6 5 4 3 2 1 10 
8 7 6 9 5 4 3 2 1 10 
8 7 6 5 9 4 3 2 1 10 
8 7 6 5 4 9 3 2 1 10 
8 7 6 5 4 3 9 2 1 10 
8 7 6 5 4 3 2 9 1 10 
8 7 6 5 4 3 2 1 9 10 
7 8 6 5 4 3 2 1 9 10 
7 6 8 5 4 3 2 1 9 10 
7 6 5 8 4 3 2 1 9 10 
7 6 5 4 8 3 2 1 9 10 
7 6 5 4 3 8 2 1 9 10 
7 6 5 4 3 2 8 1 9 10 
7 6 5 4 3 2 1 8 9 10 
6 7 5 4 3 2 1 8 9 10 
6 5 7 4 3 2 1 8 9 10 
6 5 4 7 3 2 1 8 9 10 
6 5 4 3 7 2 1 8 9 10 
6 5 4 3 2 7 1 8 9 10 
6 5 4 3 2 1 7 8 9 10 
5 6 4 3 2 1 7 8 9 10 
5 4 6 3 2 1 7 8 9 10 
5 4 3 6 2 1 7 8 9 10 
5 4 3 2 6 1 7 8 9 10 
5 4 3 2 1 6 7 8 9 10 
4 5 3 2 1 6 7 8 9 10 
4 3 5 2 1 6 7 8 9 10 
4 3 2 5 1 6 7 8 9 10 
4 3 2 1 5 6 7 8 9 10 
3 4 2 1 5 6 7 8 9 10 
3 2 4 1 5 6 7 8 9 10 
3 2 1 4 5 6 7 8 9 10 
2 3 1 4 5 6 7 8 9 10 
2 1 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 

1 2 3 4 5 6 7 8 9 10 

优化后的算法,可以通过内循环查看是否已经排序好,如果排序好,就不再需要排序。

    #include <stdio.h>
    int main()
    {
        int nums[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int i, j,k, temp, isSorted;
        //冒泡排序算法:进行 n-1 轮比较
        for(i=0; i<10-1; i++)
        {
            isSorted = 1;
            //每一轮比较前 n-1-i 个,也就是说,已经排序好的最后 i 个不用比较
            for(j=0; j<10-1-i; j++)
            {   
                if(nums[j] > nums[j+1])
                {
                    temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                    isSorted = 0;
                }
                
                printf("\n");
                for(k=0; k<10; k++)
                {
                    printf("%d ", nums[k]);
                }

            }
           if(isSorted)  break; 
        }
        printf("\n\n");
        for(i=0; i<10; i++){
        printf("%d ", nums[i]);
        }
        printf("\n");

        return 0;
    }

执行结果

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 

1 2 3 4 5 6 7 8 9 10 

如果不优化,程序就会出现空跑。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值