当前位置: 首页 > news >正文

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²)。

五、冒泡排序的优缺点

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

六、总结

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

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

相关文章:

C语言冒泡排序教程简介

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;因其工作原理像气泡一样逐渐上浮而得名。其基本思想是通过一轮一轮地比较相邻的元素&#xff0c;将较大的元素逐步“冒泡”到数组的尾部。 在本篇博客中&#xff0c;我们将详细讲解冒泡排序的基本…...

Fabric链码部署测试

参考链接&#xff1a;运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) &#xff08;2&#xff09;fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…...

k620老显卡,装cuda.等。

CUDA安装教程&#xff08;超详细&#xff09;-CSDN博客 1.下载支持12.0以上的驱动 NVIDIA RTX Driver Release 550 R550 U12 (553.50) | Windows 11 解压。安装。一路下一步。查看结果 2.下载 cuda CUDA Toolkit Archive | NVIDIA Developer 安装cuda时&#xff0c;第一次…...

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…...

直接插入排序、折半插入排序、2路插入排序、希尔排序

本篇是排序专栏博客的第一篇&#xff0c;主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…...

FQ-GAN代码解析

主要看 model 、loss 和 data 部分如何实现和处理的。 model—VQ_modelsVQModelEncoderVectorQuantizerDecoder loss—VQLoss_triple_codebook model—VQ_models 创建vq_model直接根据传入的模型压缩倍率8/16初始化对应的VQ_8/VQ_16&#xff0c;两者都是初始化一个VQModel的类…...

如何恢复已删除的 Telegram 消息 [iOSamp;Android]

Telegram 是一款功能强大的消息应用程序&#xff0c;因其易用性、隐私保护和众多炫酷功能而深受用户喜爱。然而&#xff0c;有时我们会不小心删除重要的消息。在这种情况下你应该做什么&#xff1f; 本文将为您提供简单有效的解决方案来恢复 Telegram 上已删除的消息&#xff…...

asp.net core中的 Cookie 和 Session

在 Web 开发中&#xff0c;用户会话管理是非常重要的&#xff0c;尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术&#xff0c;如 Cookie 和 Session&#xff0c;它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细…...

Python实现一个简单的 HTTP echo 服务器

一个用来做测试的简单的 HTTP echo 服务器。 from http.server import HTTPServer, BaseHTTPRequestHandler import jsonclass EchoHandler(BaseHTTPRequestHandler):def do_GET(self):# 构造响应数据response_data {path: self.path,method: GET,headers: dict(self.headers…...

Ruby 中文编码

Ruby 中文编码 在 Ruby 编程语言中处理中文编码是一个常见的需求&#xff0c;尤其是在中国和其他使用中文的地区。Ruby 是一种动态、开放源代码的编程语言&#xff0c;它支持多种字符编码&#xff0c;包括中文编码。本文将探讨在 Ruby 中处理中文编码的几种方法&#xff0c;以…...

淘金优化算法的信息共享与更新机制改进

淘金优化算法作为一种模拟自然界淘金过程的启发式搜索算法,在解决复杂优化问题时展现出独特优势。然而,其性能在很大程度上依赖于信息共享与更新机制的有效性。传统机制在面对高维、多模态等复杂问题时,往往存在信息交流不畅、更新滞后等问题,导致算法陷入局部最优或收敛速…...

Python中的ast.literal_eval:安全地解析字符串为Python对象

Python中的ast.literal_eval&#xff1a;安全地解析字符串为Python对象 什么是ast.literal_eval&#xff1f;为什么说它是“安全”的&#xff1f; 如何使用ast.literal_eval&#xff1f;示例1&#xff1a;将字符串转换为列表示例2&#xff1a;将字符串转换为字典示例3&#xff…...

【AI数学基础】线性代数:内积和范数

&#xff08;观前提醒&#xff0c;这是工科AI相关的数学基础的学习笔记&#xff0c;不是数学专业的文章&#xff0c;所以没有严谨的证明和定义&#xff0c;数院大神请勿批评&#xff09; 2. 内积和范数 2.1 内积的定义 从代数的角度来说&#xff0c;内积是两个向量之间的一种…...

Go语言的 的泛型(Generics)核心知识

Go语言的泛型&#xff08;Generics&#xff09;核心知识 引言 在编程语言的发展历程中&#xff0c;泛型是一项重要的特性。它使得程序员能够编写更加灵活和可重用的代码&#xff0c;减少了代码重复&#xff0c;提高了类型安全性和性能。从最初的C和Java&#xff0c;到现代的R…...

C++vector

1. vector 的介绍及使用 1.1vector的介绍 vector的文档介绍 1.vector是表示可变大小数组的序列容器 2.就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素&#xff0c;也就是意味着可以采用下标对vector 的元素进行访问&#xff0c;和数组一样高效但是又不像数组…...

如何配置【Docker镜像】加速器+【Docker镜像】的使用

一、配置Docker镜像加速器 1. 安装/升级容器引擎客户端​ 推荐安装1.11.2以上版本的容器引擎客户端 2. 配置镜像加速器​ 针对容器引擎客户端版本大于1.11.2的用户 以root用户登录容器引擎所在的虚拟机 修改 "/etc/docker/daemon.json" 文件&#xff08;如果没有…...

Docker--Docker Network(网络)

Docker Network&#xff08;网络&#xff09;是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。以下是对Docker Network的详细解释&#xff1a; 一、Docker网络的重要性 Docker容器网络是为应用程序所创造的虚拟环境的一部分&#xff0c;它能让应用从宿主机操作…...

Vue项目中生成node_modules文件夹的两种常用方法及npm优势

在Vue项目中生成node_modules文件夹的过程非常简单,主要步骤如下: 1、使用 npm 安装依赖包; 2、使用 yarn 安装依赖包。其中,推荐使用npm安装依赖包,原因如下: 兼容性更广:npm是Node.js的默认包管理工具,具有更高的兼容性。社区支持:npm拥有更大的用户基础和社区支持,…...

如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程

简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库&#xff0c;旨在处理跨多个普通服务器的大量数据&#xff0c;并提供高可用性&#xff0c;没有单点故障。Apache Cassandra 是一个高度可扩展的分布…...

leetcode 面试经典 150 题:轮转数组

链接轮转数组题序号189题型数组解法1. 额外数组法&#xff0c;2. 原数组翻转法&#xff08;三次翻转法&#xff09;难度中等熟练度✅✅✅✅ 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...