【数据结构】——排序之冒泡排序

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记 、排序算法合集
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~

前面我们学习过四种排序——直接插入排序、希尔排序、直接选择排序和堆排序,今天我们就来学习交换排序的一种——冒泡排序。

1.什么是冒泡排序?

冒泡排序(BubbleSort)是一种计算机科学领域的较简单的排序算法。它的基本思想是通过重复遍历待排序的数据集,并依次比较相邻的两个数据项,如果它们的顺序错误则进行交换。这个过程会持续重复直到所有相邻的数据项都已经交换完毕,此时说明该数据集已经排好序。冒泡排序的名称来源于排序过程中,较小的数据项会被逐渐“浮”到数组顶部,这个过程就像碳酸饮料中二氧化碳气泡最终会上浮到顶部的现象一样。因此,这种排序算法因其这一特性而得名。

冒泡函数的核心思想就是:两两相邻的元素进行比较,一轮下来最大的或者最小的就会被交换到最后面,每一轮都得到该轮的最值排到后面,如果是升序就得到最大值,降序就是最小值,排n轮直到有序。

如下动图演示:

在这里插入图片描述

2.冒泡排序代码实现(升序)

2.1基础版(升序)

void bubble_sort(int arr[], int sz)//参数接收数组元素个数{for(int i=0; i<sz-1; i++)//排sz-1趟{for(int j=0; j<sz-i-1; j++)//一趟排序{if(arr[j] > arr[j+1])//前面的大就交换到后面,直到最后得到升序{//交换int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}}
//打印数据 
int main(){int arr[] = {3,1,7,5,8,9,0,2,4,6};int sz = sizeof(arr)/sizeof(arr[0]);bubble_sort(arr, sz);for(int i=0; i<sz; i++){printf("%d ", arr[i]);}return 0;}

这里注意使用两层for循环嵌套来实现,一层用来实现一趟排序所要进行的步骤,最外层for循环则表示这样的步骤要实现size-1次才能得到有序,每一趟排序都得到最值,排到后面,直到有序。

结果如下:
在这里插入图片描述

2.2进阶版(升序)

进阶实现

我们发现上述代码即使在排序过程中有序了,该跑size-1趟还是不会少,它才不管你有没有序,我只要跑我的size-1趟就好了,这样就会大大消耗我们的时间,所以我们的想个方法一旦它有序冒泡排序就停下;

解决思路

我们可以思考它什么是会有序呢?是不是一趟下来什么都没交换这样就可以判定为有序了,所以我们可以使用一个变量flag来标记。代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数{for (int i = 0; i < sz - 1; i++)//排sz-1趟{int flag = 0;//没趟排序开始flag清0for (int j = 0; j < sz - i - 1; j++)//一趟排序{if (arr[j] > arr[j + 1])//前面的大就交换到后面,直到最后得到升序{flag++;//有交换flag就++//交换int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}//一趟排序后查看flag值if (flag == 0)//如果flag = 0 ,也就是没有发生交换直接return即可return;}}
//打印数据 
int main(){int arr[] = {9,1,2,3,4,5,6,7,8};int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;}

将flag设在每趟排序里面,如果有交换flag就++;没有flag值就是0说明此时有序可以直接返回;注意不要忘了每趟排序完flag都要清0哦~不然下次使用即时没有发生交换flag也不为0;

使用int arr[] = {9,1,2,3,4,5,6,7,8};来测试结果如下:
在这里插入图片描述

3.冒泡排序代码实现(降序)

学习完升序,降序对我们来说简直是老虎吃豆芽——小菜一碟,只需将交换的条件由大于改成小于号即可

if (arr[j] < arr[j + 1])//前面的小就交换到后面,直到最后得到升序

完整代码实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数{for (int i = 0; i < sz - 1; i++)//排sz-1趟{int flag = 0;//没趟排序开始flag清0for (int j = 0; j < sz - i - 1; j++)//一趟排序{if (arr[j] < arr[j + 1])//前面的小就交换到后面,直到最后得到升序{flag++;//有交换flag就++//交换int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}//一趟排序后查看flag值if (flag == 0)//如果flag = 0 ,也就是没有发生交换直接return即可return;}}
//打印数据 
int main(){int arr[] = {9,1,2,3,4,5,6,7,8};int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;}

结果如下:
在这里插入图片描述

4.冒泡排序时间复杂度分析

时间复杂度往往分析最坏的情况,所以在分析冒泡排序时我们可以当作冒泡了size-1次,假设有n个数,也就是n-1次,每次又两两相比较,第一次比较n-1下,第二次n-2…最后一次1下,将这n-1次加起来就可以知道冒泡排序的时间复杂度啦~ 利用等差数列求和很容易算出来结果并区取最大的数量级n^2即可;
🥳🥳所以冒泡排序的时间复杂度是O(n^2)

5.结语

以上就是有关冒泡排序的所以内容啦~ 有问题的或者不懂的可以写在评论区或者私信我哦 ~ 完结撒花~🥳🥳🎉🎉🎉

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

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

相关文章

视频讲解|基于非对称纳什谈判的多微网电能共享运行优化策略

1 主要内容 该讲解视频对应的程序链接为基于非对称纳什谈判的多微网电能共享运行优化策略_吴锦领&#xff0c;主要内容是对《基于非对称纳什谈判的多微网电能共享运行优化策略》的matlab复现&#xff0c;解决的是微网间基于非对称纳什谈判的P2P电能交易共享问题&#xff0c;基…

SpringBoot接口防止重复提交(AOP+Redis)

方法一&#xff1a; 若依框架的实现 【具体靠请求地址URL参数列表来判断请求是否重复】 SpingBoot接口防止重复提交_springboot接口防抖(防重复提交)的一些实现方案-CSDN博客文章浏览阅读518次。3.根据缓存键获取缓存中对象&#xff0c;如果存在&#xff0c;判断当前请求参…

利用scipy求解方程组、拟合直线、圆、椭圆、抛物线

scipy.optimize作为优化模块可以实现任意曲线拟合&#xff0c;方程求根、非线性方程组求解、自定义代价函数求解等功能&#xff0c;下面给出了optimize中常用的几个子模块&#xff1a; minimize&#xff1a;需要自己构建代价函数&#xff08;有时也称损失函数&#xff0c;目标函…

MATLAB中的数学建模:基础知识、实例与方法论

前言 在当今科技高速发展的时代&#xff0c;数学建模成为了解析复杂世界的关键工具&#xff0c;而MATLAB作为一种专业的科学计算软件&#xff0c;为我们提供了强大的数学建模平台。MATLAB不仅仅是Matrix Laboratory的简称&#xff0c;更是一个集数值分析、矩阵计算、算法开发和…

【C#】C#踩坑三角函数之uvw平台

背景 最近再弄一个uvw平台&#xff0c;uvw平台厂商会提供一个公式里面用到了三角函数&#xff1a; 踩坑记录 一开始&#xff0c;我以为Math.Cos参数是度数&#xff0c;所以怎么算都不对! 一度怀疑C#的Math库。 后面才意识到&#xff0c;这个参数会不会是弧度&#xff1f;结…

携程20240320java暑假实习面经

1. 自我介绍 2. 多久开始学java的 3. ConcurrentHashMap 怎么保证线程安全 1.7 与 1.8 4. 讲一讲你对线程池的理解&#xff0c; 并讲一讲使用的场景 5. 单例模式 如何线程安全 6. 有哪些垃圾回收器 选一个讲一下垃圾回收的流程 7. 讲一讲mysql 的索引 &#xff0c; 如…

我的电脑win11系统安装了谷歌浏览器,桌面的快捷方式打不开

安装好浏览器以后双击打不开右键打开文件位置也弹窗报错提示 但是我发现开始栏里面可以打开 说明我的软件应该是没有问题的&#xff0c;研究了一下 我实际的安装目录在&#xff1a;C:\Program Files\Google\Chrome\Application 桌面的快捷方式右键查看属性显示的地址却不对&a…

什么是单点登录?

单点登录&#xff08;Single Sign On&#xff0c;简称 SSO&#xff09;简单来说就是用户只需在一处登录&#xff0c;不用在其他多系统环境下重复登录。用户的一次登录就能得到其他所有系统的信任。 为什么需要单点登录 单点登录在大型网站应用频繁&#xff0c;比如阿里旗下有淘…

JavaEE 初阶篇-深入了解进程与线程(常见的面试题:进程与线程的区别)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 进程概述 2.0 线程概述 2.1 多线程概述 3.0 常见的面试题&#xff1a;谈谈进程与线程的区别 4.0 Java 实现多线程的常见方法 4.1 实现多线程方法 - 继承 Thread 类…

理解文件操作

1. 为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化…

Visual Studio 插件 AnAPI++ for VS 2022

Anmial API abbreviation AnAPIis an automatically generated WebAPI project that has encapsulated Jwt Oauth2 token authentication, SqlSugar, Swagger, Nlog, Cross domain technologies, and supports Net6 and above versions Anmial API缩写AnAPI是一个自动生成的Web…

基于SpringBoot和HeatMap的全球地震热力图可视化实践

目录 前言 一、关于热力图 1、HeatMap简介 2、属性和方法介绍 二、全球地震热力图反演 1、地震信息查询开发 2、前端地图开发 三、地震带反演成果 1、三大地震带反演 2、地震区域分析 总结 前言 众所周知&#xff0c;全球的地震带主要可以分为三处地震带——环太平洋地…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口&#xff1a;7001&#xff0c;历史漏洞&#xff1a;CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞&#xff1a;CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

C#使用ASP.NET Core Razor Pages构建网站(三)

上一篇文章了解Razor Pages 链接&#xff1a;C#使用ASP.NET Core Razor Pages构建网站&#xff08;二&#xff09; 接下来继续了解ASP.NET Core Razor Pages构建网站的后续内容 一、将Entity Framework Core配置为服务 要在 ASP.NET Core 项目中配置 Entity Framework Core 服…

使用jupyter-Python进行模拟股票分析

tushare财经数据接口包 pip install tushare作用&#xff1a;提供相关指定的财经数据 需求&#xff1a;股票分析 使用tushare包获取某股票的历史行情数据 输出该股票所有收盘比开盘上涨3%以上的日期 输出该股票所有开盘比前日收盘跌幅超过2%的日期 假如我从2015年1月1日开…

【Caddy】Caddy实践1——此网站无法提供安全连接

背景&#xff1a;卸载 最近安装Caddy在另外一个机器上出现了错误&#xff0c;执行步骤如下&#xff1a; 步骤一&#xff1a;添加 Caddy 软件源并安装 执行以下命令添加 Caddy 的软件源并安装&#xff1a; sudo apt install -y debian-keyring debian-archive-keyring apt-t…

哨兵位、链表的链接

哨兵位&#xff1a; 通俗的话讲就是额外开辟一块空间&#xff0c;指向链表的头部。 合并两个有序链表 已解答 简单 相关标签 相关企业 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#…

java入门学习

程序员必备&#xff1a;常见算法与应用综述 算法是计算机科学的核心&#xff0c;是解决问题的关键。在程序员的日常工作中&#xff0c;算法无处不在。本文将以“程序员常用的几种算法”为主题&#xff0c;从多个维度介绍程序员常用的算法&#xff0c;并分析其适用场景、优缺点…

在 CentOS 7 上编译安装 Nginx 1.18

1. 安装依赖包 首先&#xff0c;安装 Nginx 所需的基本依赖包&#xff1a; yum install -y gcc gcc-c make automake autoconf pcre-devel zlib-devel openssl-devel2. 下载 Nginx 源代码 wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -xzvf nginx-1.18.0.tar.g…

Jupyter R绘图 汉字显示乱码的解决办法

1.Jupyte中&#xff0c;R绘图&#xff0c;汉字显示乱码 2.如何解决&#xff1f; (1)R中安装showtext 登录linux服务器 #R > install.packages(“showtext”) … 出错 (2)退出R,安装freetype-config #apt install libfreetype6-dev 出错 &#xff08;3&#xff09;进入R&…