C语言冒泡排序教程简介

冒泡排序(Bubble Sort)是一种简单的排序算法,因其工作原理像气泡一样逐渐上浮而得名。其基本思想是通过一轮一轮地比较相邻的元素,将较大的元素逐步“冒泡”到数组的尾部。

在本篇博客中,我们将详细讲解冒泡排序的基本概念,如何在C语言中实现冒泡排序,并提供一些示例来帮助大家理解。


一、冒泡排序的原理

冒泡排序的核心思想是:通过多次遍历数组,将较大的元素逐步交换到数组的末端。每一轮遍历都会将一个最大的元素“冒泡”到正确的位置。

假设我们有一个数组 [5, 3, 8, 4, 2],冒泡排序的过程如下:

  1. 第一轮遍历:

    • 比较 53,因为 5 > 3,交换它们。
    • 比较 58,无需交换。
    • 比较 84,因为 8 > 4,交换它们。
    • 比较 82,因为 8 > 2,交换它们。

    第一轮之后,数组变成:[3, 5, 4, 2, 8]。此时,最大值 8 已经排好位置。

  2. 第二轮遍历:

    • 比较 35,无需交换。
    • 比较 54,因为 5 > 4,交换它们。
    • 比较 52,因为 5 > 2,交换它们。

    第二轮之后,数组变成:[3, 4, 2, 5, 8]。最大值 5 已经排好位置。

  3. 第三轮遍历:

    • 比较 34,无需交换。
    • 比较 42,因为 4 > 2,交换它们。

    第三轮之后,数组变成:[3, 2, 4, 5, 8]。最大值 4 已经排好位置。

  4. 第四轮遍历:

    • 比较 32,因为 3 > 2,交换它们。

    第四轮之后,数组变成:[2, 3, 4, 5, 8]。此时,所有元素已经按升序排列。


二、冒泡排序的代码实现

现在,让我们通过C语言代码来实现冒泡排序。

#include <stdio.h>// 冒泡排序函数
void bubbleSort(int arr[], int n) {// 外层循环控制总的轮数for (int i = 0; i < n - 1; i++) {// 内层循环进行相邻元素的比较与交换for (int j = 0; j < n - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}// 输出数组
void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {5, 3, 8, 4, 2};  // 初始化数组int n = sizeof(arr) / sizeof(arr[0]);  // 计算数组元素个数printf("排序前的数组: ");printArray(arr, n);  // 输出排序前的数组bubbleSort(arr, n);  // 调用冒泡排序函数printf("排序后的数组: ");printArray(arr, n);  // 输出排序后的数组return 0;
}

三、代码分析

  1. bubbleSort函数

    • 外层循环控制冒泡的轮数,每一轮都会将一个最大的元素“冒泡”到正确的位置。
    • 内层循环比较相邻的元素,如果前一个元素大于后一个元素,则交换它们的位置。
    • 注意:内层循环的次数随着外层循环的进行逐渐减少,因为每轮排序之后,最大的元素已经排好位置。
  2. printArray函数

    • 用于输出数组中的元素,帮助我们查看排序前后的数组状态。
  3. main函数

    • 创建一个数组,并初始化。
    • 输出排序前的数组。
    • 调用bubbleSort函数进行排序。
    • 输出排序后的数组。

四、冒泡排序的时间复杂度

冒泡排序的时间复杂度为 O(n²),其中 n 是数组的长度。由于冒泡排序需要进行两层嵌套循环:外层循环进行 n - 1 次遍历,内层循环最多进行 n - i 次比较和交换。

  • 最好情况:如果数组已经是有序的,冒泡排序仍然会进行 n - 1 轮遍历。此时,时间复杂度为 O(n),但这是一个理想情况。
  • 最坏情况:如果数组是逆序排列的,每一轮遍历都需要交换元素,时间复杂度为 O(n²)。
  • 平均情况:大部分情况下,时间复杂度为 O(n²)。

五、冒泡排序的优缺点

优点:
  • 简单易懂:冒泡排序是最简单的排序算法之一,非常适合初学者理解。
  • 原地排序:不需要额外的存储空间,只需常数空间。
缺点:
  • 效率低下:时间复杂度较高,特别是在处理大规模数据时,效率较低。
  • 交换次数多:在排序过程中频繁交换元素,可能会消耗较多的时间。

六、总结

冒泡排序是一种简单的排序算法,适合小规模数据的排序。当数据量较大时,冒泡排序的效率较低,通常不推荐使用。在实际开发中,我们更常使用其他更高效的排序算法,如快速排序或归并排序。

希望通过这篇博客,大家能够掌握冒泡排序的基本思想和实现方式,并能在实际编程中灵活运用。如果你有任何问题或疑惑,欢迎在评论区留言,我们一起讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在JavaScript开发中,如何判断对象自身为空?

前言 如何判断一个对象为空是我们在开发中经常会遇到的问题&#xff0c;今天我们来聊聊几种经常使用的方法&#xff0c;以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化&#xff0c;转为相应的 JSON 格式。 const obj {};cons…

SpringCloud系列教程:微服务的未来(十)服务调用、注册中心原理、Nacos注册中心

本博客将重点介绍服务调用和注册中心的原理&#xff0c;特别是以 Nacos 为例&#xff0c;详细讲解 Nacos 注册中心如何实现服务的注册与发现。同时&#xff0c;分析 Nacos 注册中心在分布式微服务中的应用&#xff0c;帮助开发者更好地理解其工作机制。 目录 前言 微服务拆分…

NRC优先级中比较特殊的—NRC0x13和NRC0x31

1、基础知识 大家都了解 NRC0x13&#xff0c;表示长度错误和格式错误 NRC0x31&#xff0c;表示DID不支持和数据格式不支持 2、为什么说这两个NRC比较特殊 看下图的标注部分&#xff1a; 2.1、先看NRC0x13 步骤一&#xff1a;仔细看是先判断Minmun Length Check &#xff0…

Redis 笔记(二)-Redis 安装及测试

一、什么是 Redis 中文网站 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用 ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value&#xff0c;并提供多种语言的 API。 Redis 开源&#xff0c;遵循 BSD 基…

eNSP之家——路由器--入门实例详解

eNSP路由器配置&#xff1a;IP、DHCP与DNS详解-CSDN博客 练习1&#xff1a;两个路由器配置ip地址&#xff0c;并用ping命令测试连通性。 打开ensp&#xff0c;拉进来两个路由器AR2220,再用auto连接两个路由器。 选中两个路由器&#xff0c;右键启动&#xff0c;等待半分钟路由…

Electron快速入门——跨平台桌面端应用开发框架

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

机器学习基础-机器学习的常用学习方法

目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…

Qt QDockWidget详解以及例程

Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列)&#xff0c;也可以作为QMainWindow上的顶级窗口浮动 (类似一…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…

【Linux 之 二十 】使用 ln 命令创建符号链接

ln&#xff08;英文全拼&#xff1a;link files&#xff09;是Linux中非常重要的一个命令&#xff0c;用创建一个硬链接或者一个符号链接&#xff08;也叫软链接&#xff09;。它的功能是为某一个文件或目录在另外一个位置建立一个同步的链接。当我们需要在多个目录下都能显示某…

B树及其Java实现详解

文章目录 B树及其Java实现详解一、引言二、B树的结构与性质1、节点结构2、性质 三、B树的操作1、插入操作1.1、插入过程 2、删除操作2.1、删除过程 3、搜索操作 四、B树的Java实现1、节点类实现2、B树类实现 五、使用示例六、总结 B树及其Java实现详解 一、引言 B树是一种多路…

Nature Electronics——近传感器计算:50 nm异构集成技术的革命

创新点&#xff1a;1.高密度互联设计&#xff1a;基于二维材料&#xff0c;开发出互连密度高达62,500 I/O每平方毫米的M3D集成结构。2.异构层堆叠&#xff1a;整合了第二层石墨烯化学传感器和第一层MoS₂记忆晶体管&#xff0c;实现功能互补。3.超短传感器与计算元件距离&#…

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…

江科大STM32入门——IIC通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 &#xff08;一&#xff09;简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 支持多主机 支持7位/10位地址模式 支持不同的通讯速…

vue2日历组件

这个代码可以直接运行&#xff0c;未防止有组件库没安装&#xff0c;将组件库的代码&#xff0c;转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…

Java语法总结

Java的数据类型分为基本数据类型和引用数据类型。 1.基本数据类型&#xff1a;四类八种 byte 和short 比较特殊&#xff0c;不必考虑int类型&#xff0c;只关注是否超出了表示范围。 数据超出了int的范围&#xff0c;改正&#xff1a;在后边添加L &#xff0c;定义变量报错…

自动驾驶控制与规划——Project 6: A* Route Planning

目录 零、任务介绍一、算法原理1.1 A* Algorithm1.2 启发函数 二、代码实现三、结果分析四、效果展示4.1 Dijkstra距离4.2 Manhatten距离4.3 欧几里德距离4.4 对角距离 五、后记 零、任务介绍 carla-ros-bridge/src/ros-bridge/carla_shenlan_projects/carla_shenlan_a_star_p…

闲谭SpringBoot--ShardingSphere分库分表探究

文章目录 1. 背景2. 创建数据库3. 修改yml配置文件4. 分片算法类5. 测试6 小结 1. 背景 接上文&#xff0c;我们对日志表&#xff0c;进行了按月的分表&#xff0c;这样每个月几百万条数据量还是扛得住的。 但是如果数据再多呢&#xff0c;除了提高硬件性能&#xff0c;还有一…

IT面试求职系列主题-Jenkins

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统&#xff0c;并在发生更改时启动和监视构建系统。 2&#xff09;Maven、Ant和Jenkins有什么区别…

STM32供电参考设计

STM32供电参考设计 ​ 在图中有VDD&#xff0c;VSS和VDDA&#xff0c;VSSA两种类型的供电引脚&#xff0c;其数据手册解释如下&#xff1a; ​ 令我不解的是&#xff1a;VDDA和VSSA必须分别连接到VDD和VSS&#xff0c;这是什么意思&#xff1f;有大佬能够解答一下吗&#xff1f…