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

十大排序之:冒泡排序

目录

一、简介

实现过程 

时间复杂度

二、代码实现

函数声明

Swap函数 

单趟

多趟

测试 

优化 


一、简介

冒泡排序是一种简单的排序算法,它重复地比较相邻的两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。这个过程类似于气泡在水中上升的过程,因此被称为冒泡排序。

 

实现过程 

下面是冒泡排序的实现过程:

  1. 从待排序的数组中的第一个元素开始,依次比较相邻的两个元素。
  2. 如果前一个元素大于后一个元素,则交换它们的位置。
  3. 继续比较下一对相邻元素,直到比较到数组的最后一个元素。
  4. 重复以上步骤,每次比较的元素个数减少一位,直到最后一个元素。
  5. 重复以上步骤,直到所有元素都按照从小到大的顺序排列。

时间复杂度

 冒泡排序的时间复杂度是O(n^2),其中n是待排序数组的长度。由于每次排序都会比较相邻的两个元素,因此需要进行n-1次比较。而每次比较都有可能进行元素交换,最坏情况下需要进行n-1次交换。因此,总的比较和交换次数都是(n-1)+(n-2)+(n-3)+...+1 = n*(n-1)/2(等差数列求和公式),即O(n^2)。

 

二、代码实现

思想随易,实现不易,接下来是冒泡排序的代码实现(以C语言为例)。

函数声明

void BubbleSort(int* a, int n);//接收一个数组,作为参数

 

Swap函数 

冒泡排序是一种交换排序,每次比较两个数,如果符合条件(大泡泡在前,小泡泡在后),则会发生位置的交换。我们先实现一个能完成两个数交换的函数Swap

Swap
功能:能实现两个数的交换
void Swap(int* pa, int* pb)
{int tmp = *pa;*pa = *pb;*pb = tmp;
}

 

单趟

我们先来完成一趟冒泡排序过程的代码:

假设有10个数,下标为0~9,在第一趟冒泡排序的过程中,要比较的下标为(0,1),(1,2),(2,3),... (8,9)。我们用for循环产生每对下标的前一个(或后一个)(以前一个为例),记为i,那么i的最大下标为n-2(n为数组元素个数)。因此,控制循环结束的条件为i<n-1(或i<=n-2)。

void BubbleSort(int* a, int n)
{//单趟(第一趟)排序的过程for (int i = 0; i < n - 1; i++){//前一个泡泡大,则换到后一个位置if (a[i] > a[i + 1]){Swap(&a[i], &a[i + 1]);}}
}

多趟

但是,以上的一趟排序只是把最大的数换到了最后,只解决了一个数的排序。因此,我们需要进行多趟的排序。假设有10(n)个数,我们只需要进行9(n-1)趟的排序,9个数到了他们正确的位置,那么余下的一个数也找到了他的位置。把趟数用j作为标记,把循环次数控制为n-1

void BubbleSort(int* a, int n)
{//j为趟数for (int j = 0; j < n - 1; j++){//单趟排序(第一趟)的过程for (int i = 0; i < n - 1; i++){//前一个泡泡大,则换到后一个位置if (a[i] > a[i + 1]){Swap(&a[i], &a[i + 1]);}}}
}

 0~n-2,循环次数为n-1。

那么,我们把第一趟的单趟冒泡排序走完后,完成了一个数的排序,把最大的数,放在了n-1,数组中最后一个下标的位置。接下来,第二趟的排序,我们要完成的是n-1个数的排序,最后一个位置的坐标为n-2,最后完成比较的那一对坐标为(n-3, n-2),所以i最大为n-3。单趟排序的代码需做些修改,使第j趟的排序,与i能够对应上。

void BubbleSort(int* a, int n)
{for (int j = 0; j < n - 1; j++){//单趟排序(第j趟)的过程for (int i = 0; i < n - 1 - j; i++){if (a[i] > a[i + 1]){Swap(&a[i], &a[i + 1]);}}}
}

我们把i控制为 i < n-1-j:

第一趟:j = 0,i < n-1-0,即 i < n - 1, i最大为n-2。

第二趟:j = 1,i < n-1-1,即 i < n - 2, i最大为n-3。

。。。

符合条件!

测试 

以上,就完成了冒泡排序的代码。

做些小小的测试:

执行完BubbleSort后,数组变为了有序,成功!

优化 

最后给出一个优化版本:

//冒泡
void BubbleSort(int* a, int n)
{for (int j = 0; j < n - 1; j++){//假设数组已经有序int flag = 1;//单趟排序(第j趟)的过程for (int i = 0; i < n - 1 - j; i++){if (a[i] > a[i + 1]){Swap(&a[i], &a[i + 1]);flag = 0;//数据发生了交换,假设错误}}//这趟排序无任何数据发生交换,数组已然有序if (flag == 1){break;}}
}

冒泡排序如果在进行某趟排序后,就已经有序了,我们再进行一趟排序后,发现无任何数据发生交换,就不然其进行下一趟的排序,直接跳出循环。 

 

以上为冒泡排序内容介绍,感谢各位读者三连支持!

相关文章:

十大排序之:冒泡排序

目录 一、简介 实现过程 时间复杂度 二、代码实现 函数声明 Swap函数 单趟 多趟 测试 优化 一、简介 冒泡排序是一种简单的排序算法&#xff0c;它重复地比较相邻的两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有元素需要交换为止。这个过程类…...

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…...

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…...

Java多线程3

1.有序性在并发编程中的含义。 有序性在并发编程中指的是在多线程环境下&#xff0c;程序的执行顺序应与单线程情况下保持一致&#xff0c;以避免出现不确定或错误的执行结果。 2.为何需要使用多线程进行程序设计&#xff1f; 使用多线程可以提高程序的效率&#xff0c;利用…...

node+Vue项目环境创建

nodeVue项目环境创建 使用淘宝镜像源使用官方镜像源()清除缓存取消取消ssl验证安装vue 使用淘宝镜像源 npm config set registry https://registry.npm.taobao.org/使用官方镜像源() 由于国内网络问题&#xff0c;安装报错 npm install -g cnpm --registryhttps://registry.…...

云智AI人工智能平台——与众不同之处

人工智能领域、深度学习、强化学习、大小模型盛行的时代&#xff0c;人工智能技术正以前所未有的速度改变着我们的世界。然而&#xff0c;在众多AI平台中&#xff0c;如何选择一个既高效又灵活的工具&#xff0c;成为了每个开发者心中的难题。今天&#xff0c;我们特别介绍一款…...

国庆节有什么好物值得入手?精选国庆节必选好物合集

一年一度的国庆节马上来临了&#xff0c;平时舍不得买的好物可以在国庆节这段时间大采购了&#xff0c;毕竟这可是年度购物的好时机&#xff0c;千万不要错过这个享受优惠的机会。还不知道买什么国庆节好物的朋友可以看看本篇文章&#xff0c;提前做好功课噢&#xff01; 好物…...

并发安全与锁

总述 这篇文章&#xff0c;我想谈一谈自己对于并发变成的理解与学习。主要涉及以下三个部分&#xff1a;goroutine&#xff0c;channel以及lock 临界区 首先&#xff0c;要明确下面两组概念 并发和并行 并行&#xff1a;指几个程序每时每刻都同时进行 并发&#xff1a;指…...

细胞分裂检测系统源码分享

细胞分裂检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…...

openssl 生成多域名 多IP 的数字证书

openssl.cnf 文件内容&#xff1a; [req] default_bits 2048 distinguished_name req_distinguished_name copy_extensions copy req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName GuangDong l…...

电影评论|基于springBoot的电影评论网站设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取&#xff1a; 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c…...

【C++】虚函数

一、什么是虚函数 在类的成员函数前加上virtual关键字&#xff0c;这个函数就是虚函数。 虚函数的所用就是完成多态。多态示例如下&#xff1a; class A {public:virtual void func()//虚函数{cout << "A" << endl;}void ftwo()//普通函数{cout <&…...

esxi虚拟机启用cbt备份(增量备份)

在虚拟机中启用CBT 1.关闭虚拟机。 右键点按虚拟机&#xff0c;Edit Settings-VM Options-Advanced-Configuration Parameters-Edit Configuration- Add parameters&#xff0c;添加ctkEnabled参数&#xff0c;并将其值设置为true。 Add parameters&#xff0c;添加scsi0:0…...

mysql 8.0 时间维度表生成(可运行)

文章目录 mysql 8.0 时间维度表生成实例时间维度表的作用时间维度表生成技术细节使用时间维度表的好处 mysql 8.0 时间维度表生成实例 时间维度表的作用 dim_times&#xff08;时间维度表&#xff09;在数据仓库&#xff08;Data Warehouse&#xff09;中的作用至关重要。作为…...

打造高效实时数仓,从Hive到OceanBase的经验分享

本文作者&#xff1a;Coolmoon1202&#xff0c;大数据高级工程师&#xff0c;专注于高性能软件架构设计 我们的业务主要围绕出行领域&#xff0c;鉴于初期采用的数据仓库方案面临高延迟、低效率等挑战&#xff0c;我们踏上了探索新数仓解决方案的征途。本文分享了我们在方案筛选…...

15.3 JDBC数据库编程

15.3 JDBC数据库编程 15.3.1 创建数据库和表 创建一个名为webstore的数据库&#xff0c;并向其中添加数据&#xff0c;代码如下: 1.创建数据库 CREATE TABLE products( id int PRIMARY KEY, pname VARCHAR(20) brand VARCHAR(20), price FLOAT(7,2), stock SMALLINT, ) …...

SSH公私钥后门从入门到应急响应

目录 1. SSH公私钥与SSH公私钥后门介绍 1.1 SSH公私钥介绍 1.1.1 公钥和私钥的基本概念 1.1.2 SSH公私钥认证的工作原理(很重要) 1.2 SSH公私钥后门介绍 2. 如何在已拿下控制权限的主机创建后门 2.1 使用 Xshell 生成公钥与私钥 2.2 将公钥上传到被需要被植入后门的服务…...

服务器数据恢复—Linux操作系统环境下网站数据的恢复案例

服务器数据恢复环境&#xff1a; 一台linux操作系统服务器上跑了几十个网站&#xff0c;服务器上只有一块SATA硬盘。 服务器故障&#xff1a; 服务器突然宕机&#xff0c;尝试再次启动失败。将硬盘拆下检测&#xff0c;发现存在坏扇区。找当地一家数据恢复公司处理后&#xff…...

开放式耳机是怎么样的?开放式耳机的优缺点分析?

开放式耳机作为一种独特的耳机类型&#xff0c;因其独特设计和使用体验受到了许多用户的喜爱。了解开放式耳机的优缺点有助于大家更好地选择适合自己需求的耳机。以下是开放式耳机的一些主要优点和缺点分析&#xff1a; 优点 l 舒适度高 开放式耳机的设计通常更加轻盈&#…...

HDMI色块移动——FPGA学习笔记13

一、方块移动原理 二、实验任务 使用FPGA开发板上的HDMI接口在显示器上显示一个不停移动的方块&#xff0c;要求方块移动到边界处时能够改变移动方向。显示分辨率为800*480&#xff0c;刷新速率为90hz。&#xff08;480p分辨率为800*480&#xff0c;像素时钟频率Vga_clk 800x4…...

数组专项(一):数组排序、去重、查找

大家好,欢迎来到《算法面试60讲(2026最新版全真题带解析)》第19篇!上一篇我们彻底吃透了字符串专项的核心难点——BF暴力匹配与KMP高效匹配算法,搞定了字符串模块面试最难的算法考点。从本节课开始,我们正式进入算法面试第一高频模块:数组专项。 在算法面试中,数组是出…...

飞书远程控机:OpenClaw配置全攻略

本文详细介绍如何通过 OpenClaw 工具对接飞书开放平台&#xff0c;配置智能机器人实现 Windows 电脑的远程控制。主要内容涵盖文件管理和程序启动等核心功能的实现方法&#xff0c;并提供完整的配置指南与常见问题解决方案。 一、使用前提说明 1. 系统要求 仅适用于 Windows…...

DeepSeek-R1补全能力封测倒计时(仅剩72小时开放API灰度权限):这份内部测试SOP已被3家头部科技公司紧急采购

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek-R1代码补全能力封测全景概览 DeepSeek-R1 是深度求索&#xff08;DeepSeek&#xff09;推出的高性能开源推理模型&#xff0c;在代码补全场景中展现出显著的上下文理解力与多语言泛化能力。本…...

0.2毫秒快速启动的操作系统

在工业控制以及航空航天等核心场景&#xff0c;极速启动就是高可靠系统的生命线。0.2毫秒超快启动搭配硬件看门狗&#xff0c;让设备在掉电重启、异常恢复时瞬时归位&#xff0c;关键任务永不延误&#xff01; https://www.bilibili.com/video/BV11mLY6VERt/?spm_id_from333.1…...

随机森林算法在儿童出行方式预测中的实战应用与优化

1. 项目概述&#xff1a;用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候&#xff0c;你肯定想过一个问题&#xff1a;孩子们到底是怎么上学的&#xff1f;是走路、骑车、坐公交还是家长开车送&#xff1f;这个问题看似简单&#xff0c;背后却牵扯到城市规划…...

双稳健机器学习:用正交性与交叉拟合解决因果推断中的ML偏差

1. 项目概述&#xff1a;当机器学习遇见因果推断的“干扰”难题在实证研究的日常工作中&#xff0c;我们常常面临一个核心矛盾&#xff1a;我们真正关心的&#xff0c;往往只是一个或几个关键参数——比如一项政策对就业率的平均影响&#xff08;平均处理效应&#xff0c;ATE&a…...

phpMyAdmin CVE-2018-12613:从文件读取到RCE的伪协议利用链

1. 这个漏洞不是“能读文件”那么简单&#xff0c;而是后台权限的彻底失守phpMyAdmin 4.8.1里那个CVE-2018-12613&#xff0c;很多人扫到就报个“存在文件包含”&#xff0c;顺手贴个?targetphp://filter/convert.base64-encode/resource/etc/passwd截图完事。我去年在给一家教…...

总线式智能提示灯系统设计:从恒流驱动到模块化架构

1. 项目概述&#xff1a;从传统到智能的剧场提示灯系统革新在剧场、演播室或者大型活动现场的后台&#xff0c;如果你待过&#xff0c;一定对那套“红灯停&#xff0c;绿灯行”的提示灯系统不陌生。导演或舞台监督通过对讲机喊“Standby”&#xff08;准备&#xff09;&#xf…...

从零构建FOC轮腿机器人:开源平衡机器人完整指南

从零构建FOC轮腿机器人&#xff1a;开源平衡机器人完整指南 【免费下载链接】foc-wheel-legged-robot Open source materials for a novel structured legged robot, including mechanical design, electronic design, algorithm simulation, and software development. | 一个…...

观察Token消耗明细,Taotoken用量看板如何帮助控制预算

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Token消耗明细&#xff0c;Taotoken用量看板如何帮助控制预算 对于个人开发者或项目管理者而言&#xff0c;在使用大模型API时…...