算法沉浸式学习:冒泡排序法(C语言)

目录

  • 1.简介
  • 2.冒泡排序的代码实现以及优化
      • 2.1冒泡排序的代码实现
      • 2.1代码优化
  • 3.冒泡排序的时间复杂度和稳定性
      • 3.1冒泡排序的时间复杂度
      • 3.2冒泡排序的稳定性
  • 4.结语

1.简介

冒泡排序是一种较为简单的排序算法,它又被称为气泡排序或者泡沫排序。它会遍历若干次要排序的数列,每次遍历,它都会从前往后依次比较相邻两数的大小,如果前者比后者大,则它们就会交换位置。这样一次遍历之后,最大的元素就在数列的末尾,再次采用相同的方法,第二大的元素就会被排列在最大的元素之前,以此类推,一直重复这种操作直到整个数列都有序为止。

在这里插入图片描述

2.冒泡排序的代码实现以及优化

2.1冒泡排序的代码实现

#include <stdio.h>

int main() {
    int i, j;
    int a[6] = {20, 40, 30, 10, 60, 50};

    // 外层循环控制比较轮数
    for (i = 5; i > 0; i--) {
        // 内层循环进行相邻元素比较和交换
        for (j = 0; j < i; j++) {
            // 如果前一个元素大于后一个元素,则进行交换
            if (a[j] > a[j+1]) {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }

    return 0;
}
			

它的冒泡排序的过程如下图在这里插入图片描述
我们首先分析第一趟:
当i=5,j=0时,a[0]<a[1],在这个时候我们不做任何处理;
当i=5,j=1时,a[1]>a[2],此时交换a[1]和a[2]的值,交换之后a[1]=30,a[2]=40;
当i=5,j=2时,a[2]>a[3],此时交换a[2]和a[3]的值,交换之后a[2]=10,a[3]=40;
当i=5,j=3时,a[3]>a[4],此时不做任何处理;
当i=5,j=2时,a[4]>a[5],此时交换a[4]和a[5]的值,交换之后a[4]=50,a[5]=60;
当我们第一趟排完之后,数列{20, 40, 30, 10, 60, 50}就变成了{20, 30, 10, 40, 50, 60} 我们根据这种方法:第二趟排完之后数列a[5~6]是有序的
第三趟排完之后数列a[4~6]是有序的
第四趟排完之后数列a[3~6]是有序的
第五趟排完之后整个数列就有序了

2.1代码优化

我们如果仔细观察上面的代码,可以发现在拍完第三趟之后,数据已经是有序的了,第四趟和第五趟并没有进行数据交换,因此我们可以对这个冒泡排序的代码进行一个小小的优化,使它的效率更高一些。
我们可以添加一个标记,如果在一趟遍历中发生了交换,标记为0,如果没有发生交换则标记为1

以下是优化后的代码

#include <stdio.h>

int main() {
    int i, j;
    int a[6] = {20, 40, 30, 10, 60, 50};
    int flag = 0; // 标志变量,用于表示是否发生了交换

    // 外层循环控制比较轮数
    for (i = 5; i > 0; i--) {
        // 内层循环进行相邻元素比较和交换
        for (j = 0; j < i; j++) {
            // 如果前一个元素大于后一个元素,则进行交换
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                flag = 1; // 标记发生了交换
            }
        }
        
        if (!flag) {
            break; // 如果发生了交换,则提前结束外层循环
        }
    }

    return 0;
}

3.冒泡排序的时间复杂度和稳定性

3.1冒泡排序的时间复杂度

冒泡排序的时间复杂度是O(N2),假设我们要排序的数列中有N个数,遍历一趟的时间复杂度是O(N),那么我们需要遍历多少次呢?我们可以想一下,当我们遍历到第N-1次的时候,第一个已经是最小的了,所以冒泡排序的时间复杂度是O(N2).

3.2冒泡排序的稳定性

冒泡排序是一个稳定的算法,因为它满足 稳定算法的定义

4.结语

大家好,我是一名刚开始学C语言的小白,也是刚开始接触博客这个东西,也没有太大的经验,我发的文章也算不上什么专业的教程,只是和大家分享我所学的知识,如果在看这篇文章的你也是刚开始想要学习算法的小白,我们可以一起学习一起进步,我会每隔两三天更新一篇文章,如果有刚开始学习算法的小白,可以订阅我的专栏,我写的这些是根据自己的理解写的,可能有些说的不太对的地方,希望大家指正,有什么意见或者问题也可以在评论区提出来,我会认真的一条一条认真回复大家的,希望大家点点赞点点关注,今天的分享就到这里了,谢谢大家的阅读

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

include、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值