【C 语言】深入理解冒泡排序算法

news2024/9/8 16:45:44

0. 前言

冒泡排序是一种经典且基础的排序算法。它虽然在效率上并非最优,但对于初学者理解排序的基本概念和逻辑有着重要的意义。

1. 冒泡排序的基本思想

冒泡排序的基本思想是通过反复比较相邻的元素并交换它们(如果顺序错误),就像水中的气泡一样,较小的元素会逐渐“浮”到数组的前端,较大的元素则“沉”到数组的后端

我们来看一个例子:

待排序数组:【8 7 4 3 2】 现在需要升序排列 

第一趟排序:

第1次先将最前面的两个数8和7对调。第2次将第2和第3个数(7和4)对调…如此共进行4次,得到7 4 3 2 8的顺序,可以看到:最大的数8已“沉底”,成为最下面一个数,而小的数“上升”。最小的数2已向上“浮起”一个位置。经过第1(共4比较与交换)后,已得到最大的数8。如图所示

然后进行第2趟比较,对剩下的前面4个数(7,4,3,2)进行新一轮的比较,使第二大的数“沉底”。同样按照上面方法进行第2趟比较。经过这一趟3次比较与交换,得到次大的数7.

按此规律进行下去,可以推知,对5个数需要比较4趟,才能使5个数按从小到大排列。

在第1趟中要进行两个数之间的比较共4次,在第2趟过程中比较3次…第4趟只须比较1次。

总结一下:

如果一个数组中有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,

在第i趟比较中要进行n-i次两两比较。

具体冒泡的方式:

用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾。

代码实现: 

//冒泡排序
void BubbleSort(int arr[], int sz)
{
    // 外层循环控制冒泡排序的趟数
    // sz-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
    for (int i = 0; i < sz - 1; i++)
    {
        // 具体冒泡的方式:用相邻的两个元素进行比较,
        //前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
        for (int j = 1; j < sz - i; j++)
        {
            if (arr[j - 1] > arr[j])
            {
                int tmp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}

int main()
{
    int arr[] = { 8,7,4,3,2 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;

    BubbleSort(arr, sz);//调用函数
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);//排序后输出
    }
    return 0;
}

运行一下看看

 是我们想要的效果! 确实排成升序了

2. 优化 

假设我们的待排数组是【1,3,5,7,9】,要排序升序,我们发现已经是升序排列的了

如果还要按照冒泡排序进行两两交换的话,效率就很慢了~

原来,冒泡排序也有它的短板,不管是什么样的数据,即使已经排好序了,但仍是会进行后边的比较,直到全部比较完成

因此,我们可以对代码进行优化,如果发现在某趟排序中,没有发生一次交换,

可以提前结束冒泡排序。

解决方式:可以通过一个标志位flag来进行判断

//冒泡排序
void BubbleSort(int arr[], int sz)
{
    int flag = 0;//定义一个标志位,用于判定元素之间是否进行了交换
    // 外层循环控制冒泡排序的趟数
    // sz-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
    for (int i = 0; i < sz - 1; i++)
    {
        // 具体冒泡的方式:用相邻的两个元素进行比较,
        //前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
        for (int j = 1; j < sz - i; j++)
        {
            if (arr[j - 1] > arr[j])
            {
                int tmp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = tmp;
            }
        }
        //在进行完一轮的排序之后,判断本轮是否发生了元素之间的交换
            //如果没有发生交换,说明数组已经是有序的了,则直接结束排序
        if (!flag)
        {
            break;
        }
        else
        {
            //如果发生了交换,那么在下一轮排序之前将flag再次置为0
            //以便记录下一轮排序的时候是否会发生交换
            flag = 0;
        }
    }
}

这样,冒泡排序的效率会得到一定效率的提升。

3. 冒泡排序的时间复杂度和空间复杂度

这里我们浅浅了解下冒泡排序的时间复杂度和复杂度,到数据结构部分我们会详细探讨~

1. 冒泡排序的时间复杂度为  ,这是因为在最坏情况下,需要进行  次比较和交换操作。

2. 空间复杂度为  ,因为它只在原数组上进行操作,不需要额外的存储空间。

4、冒泡排序的优缺点

优点:

  1. 实现简单,逻辑清晰,易于理解和实现。
  2. 对于小型数据集,性能尚可。

缺点:

  1. 时间复杂度较高,对于大型数据集效率低下。
  2. 比较和交换操作较多,相对较耗时。

5. 总结

冒泡排序虽然在效率上不如一些高级排序算法,但作为学习排序算法的基础,它有助于我们理解排序的基本概念和原理。在实际应用中,根据数据规模和性能要求,我们可以选择更适合的排序算法。

希望通过这篇文章,您会对冒泡排序有个初步的理解!等未来我们学习更多排序算法,

会进一步对比各种排序算法的效率,你会了解更爱深入的!

以上是本期博客分享的内容,希望对你学习有帮助!ღ( ´・ᴗ・` )


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统(195)

一、前言 1.1 项目介绍 【1】项目功能介绍 随着我国老龄化进程的加快,养老问题日益突出,如何有效保障老年人的生活质量与安全成为社会关注的重点。智能化、信息化技术的发展为解决这一问题提供了新的思路和手段。基于Linux系统的智能养老院出入管理系统应运而生,为了实现…

记录一次使用Docker部署skywalking的过程

临时一个测试系统需要追一下bug&#xff0c;所以计划单节点部署一套skywalking进行调用链分析。 网上扒拉了几篇&#xff0c;都有点问题&#xff0c;这里单独记录一个。 首先skywalking需要是用es做数据源&#xff0c;当然也有mysql等多个版本&#xff0c;这里用的es。 同时…

使用JavaFx Fxml笔记

使用JavaFx Fxml实现账号密码登录 HelloApplication.java&#xff1a;package com.example.dr295cmonth7;import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.Scene; i…

Pinely Round 4 (Div. 1 + Div. 2)

有不明白或者想交流一下的可以加一下扣扣&#xff1a;2674993642&#xff0c;博客一般写的时候才看 A. Maximize the Last Element 解析&#xff1a;题目要让一次删除两个相邻的数字&#xff0c;最后留下尽可能最大的数字&#xff0c;赛时我用笔模拟了一下&#xff0c;发现如…

c++11,左值引用和右值引用,右值引用的作用

目录 左右值引用概念 右值引用的作用 左右值引用概念 什么是左值&#xff1f;什么是左值引用&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋 值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出…

最详细最新最简单的Jenkins安装使用

首先去jenkins官网下载最新LTS war版本https://www.jenkins.io/download/ 准备sdk包 、nginx配置文件 、已配置的maven文件 查看系统架构 cat /etc/redhat-release uname -a uname -m lscpu安装常用工具 yum install jq -y yum install git -yyum install nginx -y systemc…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师&#xff0c;对JVM及其字节码有着深入的理解。现在&#xf…

DRAM 和 NAND 闪存收入将在 2024 年显著增长 75% 和 77%

#### 市场概况 根据 TrendForce 最新发布的市场报告&#xff0c;预计 2024 年 DRAM 和 NAND 闪存的收入将分别显著增长 75% 和 77%&#xff0c;这一增长主要是由于平均价格的上涨以及高价值产品的兴起&#xff0c;例如 HBM&#xff08;高带宽内存&#xff09;和 QLC&#xff0…

卷积神经网络(六)---实现 cifar10 分类

cifar10 数据集有60000张图片&#xff0c;每张图片的大小都是 32x32 的三通道的彩色图&#xff0c;一共是10种类别、每种类别有6000张图片&#xff0c;如图4.27所示。 图 4.27 cifar数据集 使用前面讲过的残差结构来处理 cifar10 数据集&#xff0c;可以实现比较高的准确率。 …

配置本地开发服务器代理请求以及登录模块开发(二)

项目初始化完成之后&#xff0c;准备开始进行项目的开发&#xff0c;首先配置好开发环境作为整个项目的基础 一、配置代理 1、config/proxy.ts配置代理 export default {// 如果需要自定义本地开发服务器 请取消注释按需调整dev: {// localhost:8000/api/** -> https://p…

Seata 入门与实战

一、什么是 Seata Seata 是一款开源的分布式事务解决方式&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式事务解决方案。 二、Seata 组成 事务协调者&#xff08;Transacti…

什么是Shell?怎么编写和执行Shell脚本?

大家好呀&#xff01;今天来简单介绍一下Shell基础&#xff0c;Shell介于内核与用户之间&#xff0c;是一个命令解释器&#xff0c;负责命令的解释。简单理解&#xff0c;Shell既是一个程序也是一种脚本语言。 1、shell介绍 1.1 概述 shell介于内核与用户之间&#xff0c;是一个…

索引结构—B+Tree索引、Hash索引、Full-Text(全文)索引、R-Tree(空间)索引

一、概述 在数据库系统中&#xff0c;索引是一种用于加快数据检索的数据结构。不同的索引结构适用于不同的查询场景和数据特性。索引按照不同角度可以划分不同类型的索引。按照数据结构可以划分BTree索引、Hash索引、FULL TEXT&#xff08;全文&#xff09;索引、R-Tree&#…

python inf是什么意思

INF / inf&#xff1a;这个值表示“无穷大 (infinity 的缩写)”&#xff0c;即超出了计算机可以表示的浮点数的范围&#xff08;或者说超过了 double 类型的值&#xff09;。例如&#xff0c;当用 0 除一个整数时便会得到一个1.#INF / inf值&#xff1b;相应的&#xff0c;如果…

卡码网KamaCoder 103. 水流问题

题目来源&#xff1a;103. 水流问题 C题解&#xff1a;从边界往高处走&#xff0c;走过的地方做标记。第一组边界跟第二组边界能走到的地方取交集。 代码来源代码随想录。&#xff08;虽然思路一样&#xff0c;但人家代码写得比我好哇&#xff09; #include <iostream>…

pyinstaller带浏览器一起打包playwright 独立运行exe

前置条件 没有安装自带环境&#xff0c;则 playwright install 安装了自带的浏览器 查看playwright的浏览器的位置 playwright install --dry-run 打开此文件夹可以看到 新建一个多层级目录playwright\driver\package.local-browsers 然后复制chromium-1124到playwright\dr…

听说它可以让代码更优雅

一提到静态代码检查工具这个词应该比较好理解&#xff0c;所谓静态代码检查工具就是检查静态代码的工具&#xff0c;完美~ 言归正传&#xff0c;相信很多程序员朋友都听说过静态代码检查工具这个概念&#xff0c;它可能是我们IDE里的某一个插件&#xff0c;可能是计算机中的一…

比 faster-whisper 至少快10倍的音视频转换文字

背景介绍 前两天我自己玩玩搞搞一个音频转文字服务&#xff0c;基于 faster-whisper&#xff0c;本想着这个已经是很快的了&#xff0c;没想到还有比它更快的&#xff0c;今天就来介绍使用一下。 FunClip&#xff0c;是阿里巴巴推出的一个智能视频剪辑工具&#xff0c;它结合…

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[Bugku] web-CTF靶场详解!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境&#xff1a; 页面提示传入参数f…