七大经典排序算法——冒泡排序

文章目录

  • 📑冒泡排序介绍
  • 🌤️代码实现
  • 🌤️做个简单的优化
  • 🌤️复杂度和稳定性分析
  • ☁️结语


📑冒泡排序介绍

冒泡排序是一种简单但效率较低的排序算法。它重复地比较相邻的两个元素,如果顺序不对则交换它们,直到所有元素都被比较过一次。这样每一轮比较过后,最大的元素就会"冒泡"到最后面。接着,算法将会忽略最后一个元素,重复上述比较和交换的过程,直到所有元素都按照顺序排列。

⭐ 冒泡排序算法的步骤如下:

  1. 从数组的第一个元素开始,依次比较相邻的两个元素。
  2. 如果前一个元素大于后一个元素,交换它们的位置。
  3. 继续比较下一对相邻元素,直到最后一个元素。
  4. 重复以上步骤,每一轮比较都会将最大的元素"冒泡"到最后面。
  5. 当比较结束时,此时数组已经排好序,排序结束。

动图演示如下:
在这里插入图片描述

🌤️代码实现

🌳C语言版

// 交换函数,用于交换数组中两个元素的位置
void swap(int* arr, int i, int j) {int tmp = arr[i];  // 将第一个元素的值存储在临时变量 tmp 中arr[i] = arr[j];   // 将第二个元素的值赋给第一个元素的位置arr[j] = tmp;      // 将临时变量 tmp 的值赋给第二个元素的位置
}// 冒泡排序函数,用于对数组进行排序
void bobbleSort(int* arr, int n) {// 外层循环控制需要遍历的轮数,共进行 n-1 次遍历for (int i = 0; i < n - 1; i++) {// 内层循环进行相邻元素的比较和交换// j 的范围是从 0 到 n-i-1,这样每次内层循环可以比较并将最大值移动到最后for (int j = 0; j < n - i - 1; j++) { // j 进循环的条件容易出错,特殊标记下// 如果前一个元素比后一个元素大,交换它们if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1);  // 调用交换函数进行交换}}}
}

🌳java版

// 交换函数,用于交换数组中两个元素的位置
private static void swap(int[] array, int i, int j) {int tmp = array[i]; // 将第一个元素的值存储在临时变量 tmp 中array[i] = array[j]; // 将第二个元素的值赋给第一个元素的位置array[j] = tmp; // 将临时变量 tmp 的值赋给第二个元素的位置
}// 冒泡排序函数,用于对数组进行排序
public static void bubbleSort(int[] array) {// 外层循环控制需要遍历的轮数for (int i = 0; i < array.length; i++) {// 内层循环进行相邻元素的比较和交换for (int j = i + 1; j < array.length; j++) {// 如果前一个元素比后一个元素大,交换它们if (array[i] > array[j]) {swap(array, i, j); // 调用交换函数进行交换}}}
}

🌤️做个简单的优化

可以在内层循环中定义一个变量 flag:用于检测这一轮内层循环是否发生了交换。初始值设为 1。
如果在一轮内层循环中没有发生交换(flag 仍为 1),说明数组已经有序,跳出循环即可。
🌳C语言版

// 交换函数,用于交换数组中两个元素的位置
void swap(int* arr, int i, int j) {int tmp = arr[i];  // 将第一个元素的值存储在临时变量 tmp 中arr[i] = arr[j];   // 将第二个元素的值赋给第一个元素的位置arr[j] = tmp;      // 将临时变量 tmp 的值赋给第二个元素的位置
}// 冒泡排序函数,用于对数组进行排序
void bobbleSort(int* arr, int n) {// 外层循环控制需要遍历的轮数,共进行 n-1 次遍历for (int i = 0; i < n - 1; i++) {int flag = 1; // 标记用于检测这一轮是否发生了交换// 内层循环进行相邻元素的比较和交换// j 的范围是从 0 到 n-i-1,这样每次内层循环可以比较并将最大值移动到最后for (int j = 0; j < n - i - 1; j++) { // j 进循环的条件容易出错,特殊标记下// 如果前一个元素比后一个元素大,交换它们if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1); // 调用交换函数进行交换flag = 0; // 发生交换后,将标记设置为 0}}// 如果没有发生交换,说明数组已经有序,提前退出排序if (flag) {break;}}
}

🌳java版


// 交换函数,用于交换数组中两个元素的位置
private static void swap(int[] array, int i, int j) {int tmp = array[i];  // 将第一个元素的值存储在临时变量 tmp 中array[i] = array[j]; // 将第二个元素的值赋给第一个元素的位置array[j] = tmp;      // 将临时变量 tmp 的值赋给第二个元素的位置
}public static void bubbleSort(int[] array) {// 外层循环控制需要遍历的轮数,共进行 array.length 次遍历for (int i = 0; i < array.length; i++) {boolean flg = true; // 标记用于检测这一轮是否发生了交换// 内层循环进行相邻元素的比较和交换// j 的范围是从 i+1 到 array.length,注意这里的起始点是 i+1for (int j = i + 1; j < array.length; j++) {// 如果前一个元素比后一个元素大,交换它们if (array[i] > array[j]) {swap(array, i, j); // 调用交换函数进行交换flg = false; // 发生交换后,将标记设置为 false}}// 如果没有发生交换,说明数组已经有序,提前退出排序if (flg) {break;}}
}

🌤️复杂度和稳定性分析

时间复杂度分析:在最坏的情况下,冒泡排序需要进行n-1轮比较,每轮比较需要进行n-i次。因此,总的比较次数为(n-1) + (n-2) + … + 2 + 1 = n(n-1)/2,近似为O(n2)。

空间复杂度分析:使用了常数个变量,因此空间复杂度为O(1)

什么是稳定性?
答:稳定性指的是相同的数据所在的位置经过排序后是否发生变化。换句话说就是大小相同的两个值在排序之前和排序之后的先后顺序不变,这就是稳定的。

稳定性分析:冒泡排序将小的元素往前调或者把大的元素往后调;比较的是相邻的两个元素,交换也发生在这两个元素之间;因为相等的元素不会进行交换,所以稳定。

总结: 冒泡排序的时间复杂度为O(N2),空间复杂度为O(1),而且是稳定的排序。


☁️结语

请给自己些耐心,不要急于求成。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

如有纰漏或错误,欢迎指正


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

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

相关文章

Leetcode | 5-21| 每日一题

2769. 找出最大的可达成数字 考点: 暴力 数学式子计算 思维 题解 通过式子推导: 第一想法是二分确定区间在区间内进行查找是否符合条件的, 本题最关键的便是 条件确定 , 第二种方法: 一般是通过数学公式推导的,这种题目我称为数学式编程题 代码 条件判断式 class Solution { …

MacBook 怎么玩Windows游戏 苹果笔记本怎么玩游戏?mac上如何玩windows游戏

传统上&#xff0c;Mac 不被认为是好的游戏机。然而&#xff0c;苹果已经开始在 Mac 上的游戏上投入更多精力&#xff0c;特别是自从转向苹果芯片以来。这使得 Mac 游戏的本机移植数量和模拟 Windows 游戏的能力都得到了显著提高。 方法一&#xff1a;Boot Camp 1、Boot Camp是…

SpirngMVC框架学习笔记(一):SpringMVC基本介绍

1 SpringMVC 特点&概述 SpringMVC 从易用性&#xff0c;效率上 比曾经流行的 Struts2 更好 SpringMVC 是 WEB 层框架&#xff0c;接管了 Web 层组件, 比如控制器, 视图, 视图解析, 返回给用户的数据格式, 同时支持 MVC 的开发模式/开发架构SpringMVC 通过注解&#xff0c;…

MATLAB:插值函数之interp与griddata

MATLAB 提供了多种插值函数来处理不同维度的数据。其中&#xff0c;interp1、interp2 和 griddata 是常用的插值函数&#xff0c;分别用于一维、二维和多维&#xff08;不规则&#xff09;数据的插值。 之前有对interp1进行过详细介绍&#xff0c;如需详细了解&#xff0c;请查…

会声会影调速怎么用 会声会影如何调整音频速度

会声会影是一款功能强大的视频编辑软件&#xff0c;可以帮助我们轻松的实现剪辑。 会声会影的操作简单易懂&#xff0c;界面简洁明快。适合家庭使用&#xff0c; 我们使用会声会影可以在家就能将视频剪辑成好莱坞大片。但是在使用的过程中&#xff0c;仍然会遇到一些操作上的问…

2024年上半年软件系统架构师论文【回忆版】

文章目录 考试时间考试地点案例分析1、微服务架构的优点和缺点2、质量属性的6个元素3、分布式锁 Redis的缺点4、MongoDB 存储矢量图的优势 论文回忆版论文一、论单元测试的设计与应用论文二、论大数据模型的设计与应用论文三、论模型驱动的架构设计及应用论文四、论云原生运维的…

探索LangGraph:如何创建一个既智能又可控的航空客服AI

这种设计既保持了用户控制权&#xff0c;又确保了对话流程的顺畅。但随着工具数量的增加&#xff0c;单一的图结构可能会变得过于复杂。我们将在下一节中解决这个问题。 第三部分的图将类似于下面的示意图&#xff1a; 状态定义 首先&#xff0c;定义图的状态。我们的状态和L…

C++:List的使用和模拟实现

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers …

网络空间安全数学基础·整除与同余

主要内容&#xff1a; 整除的基本概念&#xff08;掌握&#xff09; 素数&#xff08;掌握&#xff09; 同余的概念&#xff08;掌握&#xff09; 1.1整除 定义&#xff1a;设a&#xff0c;b是任意两个整数&#xff0c;其中b≠0&#xff0c;如果存在一个整数q&#xff0c;使 …

12306技术内幕

公司内部做的一次技术分享 文章目录 12306的成就12306系统特点12306系统难点解决思路产品角度技术角度余票库存的表如何设计&#xff1f; 抢票软件推荐巨人的肩膀 对于未公开的技术部分&#xff0c;只能结合已公开的信息&#xff0c;去做大胆的猜想。 本文提到的一些解决方案&…

测试基础05:软件测试的分类

课程大纲 1、两种架构&#xff08;Architecture&#xff09; 1.1、B/S&#xff08;Browser/Server&#xff09; 浏览器服务器架构&#xff08;大体3步&#xff09;&#xff1a;用户通过浏览器向服务器发出请求&#xff0c;服务器处理请求&#xff0c;将结果通过网络返回到用户…

使用Webcam实现摄像头的开启和关闭,并保存和复制图片

实现思路 0&#xff0c;将webcam的jar文件传入项目中 1&#xff0c;显示摄像头的地方&#xff1a;创建一个画板&#xff0c;在画板上添加开启和关闭按钮 2&#xff0c;设置开启和关闭功能&#xff1a;创建一个类实现动作监听器&#xff0c;进而实现监听动作按钮 3&#xff…

【数据结构与算法篇】二叉树链式结构及实现

【数据结构与算法篇】二叉树链式结构及实现 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 4. 二叉树链式结构的实现 4.1 前置说明 4.2 二叉树的遍历 4.2.1 前序、中序以及…

OceanBase的存储架构与传统LSM-Tree架构的异同|OceanBase数据转储合并技术解读(二)

前篇博文将OceanBase的存储架构巧妙地与自然界中的“水生态”进行了类比&#xff0c;今日我们转变视角&#xff0c;聚焦在与拥有相同LSM-Tree架构的其他产品的比较&#xff0c;深入探讨OceanBase相较于它们所展现出的独特性能。 众所周知&#xff0c;OceanBase数据库的存储引擎…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件&#xff0c;由美国加州大学Berkeley分校开发和维护&#xff0c;全称为Berkeley Internet Name Domain。该软件在DNS&#xff08;域名系统&#xff09;领域具有重要地位&#xff0c;是目前世界上使用最…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

Python怎样定位并删除Sql语句中不确定的查询条件

1.问题场景描述: 在sql语句中经常会有查询条件是:查找多个订单签订日期范围的数据,但具体的日期范围是不确定,我们如何来查找定位 例如:查询条件语句的部分如下图: 目标是: 1)定位字符串:t_contract_order.sign_date 2)最终得到结果: 解决问题思路: 1)定位要找的字符串起始位置…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习&#xff0c;目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理&#xff1a;我将PyTorch的核心概念和高级技巧进行了系统化的整理&#xff0c;从基础的张量操作到复杂的模型构建与训练。这样…

【Linux】进程终止与进程等待

目录 进程终止 errno exit和_exit 进程等待 wait和waitpid 宏&#xff1a;WIFEXITED 非阻塞等待 进程终止 下面要谈的一个话题就是进程终止&#xff0c;就是说一个进程退出了&#xff0c;可能有三种情况 1.进程代码执行完&#xff0c;结果是正确的 2.进程代码执行完&…