数据结构-冒泡排序(Python)
目录
冒泡排序算法思想
冒泡排序算法步骤
冒泡排序代码实现
冒泡排序算法分析
冒泡排序算法思想
冒泡排序(Bubble Sort)基本思想:
经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素从前面移到后面。
这个过程就像水底的气泡一样从底部向上「冒泡」到水面,这也是冒泡排序法名字的由来。
接下来,我们使用「冒泡」的方式来模拟一下这个过程。
- 首先将数组想象是一排「泡泡」,元素值的大小与泡泡的大小成正比。
- 然后从左到右依次比较相邻的两个「泡泡」:
- 如果左侧泡泡大于右侧泡泡,则交换两个泡泡的位置。
- 如果左侧泡泡小于等于右侧泡泡,则两个泡泡保持不变。
- 这 1 趟遍历完成之后,最大的泡泡就会放置到所有泡泡的最右侧,就像是「泡泡」从水底向上浮到了水面。
冒泡排序算法步骤
假设数组的元素个数为 n 个,则冒泡排序的算法步骤如下:
- 第 1 趟「冒泡」:对前 n 个元素执行「冒泡」,从而使第 1 个值最大的元素放置在正确位置上。
- 先将序列中第 1 个元素与第 2 个元素进行比较,如果前者大于后者,则两者交换位置,否则不交换。
- 然后将第 2 个元素与第 3 个元素比较,如果前者大于后者,则两者交换位置,否则不交换。
- 以此类推,直到第 n - 1 个元素与第 n 个元素比较(或交换)为止。
- 经过第 1 趟排序,使得 n 个元素中第 i 个值最大元素被安置在第 n 个位置上
- 第 2 趟「冒泡」:对前 n−1 个元素执行「冒泡」,从而使第 2 个值最大的元素放置在正确位置上。
- 先将序列中第 1 个元素与第 2 个元素进行比较,若前者大于后者,则两者交换位置,否则不交换。
- 然后将第 2 个元素与第 3 个元素比较,若前者大于后者,则两者交换位置,否则不交换。
- 依次类推,直到对 n−2 个元素与第 n−1 个元素比较(或交换)为止。
- 经过第 2 趟排序,使得数组中第 2 个值最大元素被安置在第 n 个位置上。
- 依次类推,重复上述「冒泡」过程,直到某一趟排序过程中不出现元素交换位置的动作,则排序结束。
我们以 [5,2,3,6,1,4][5,2,3,6,1,4] 为例,演示一下冒泡排序算法的整个步骤。
冒泡排序代码实现
class Solution:def bubbleSort(self, nums: [int]) -> [int]:# 第 i 趟「冒泡」for i in range(len(nums) - 1):flag = False # 是否发生交换的标志位# 从数组中前 n - i + 1 个元素的第 1 个元素开始,相邻两个元素进行比较for j in range(len(nums) - i - 1):# 相邻两个元素进行比较,如果前者大于后者,则交换位置if nums[j] > nums[j + 1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]flag = Trueif not flag: # 此趟遍历未交换任何元素,直接跳出breakreturn numsdef sortArray(self, nums: [int]) -> [int]:return self.bubbleSort(nums)
冒泡排序算法分析
- 最佳时间复杂度:O(n)。最好的情况下(初始时序列已经是升序排列),只需经过 1 趟排序,总共经过 n 次元素之间的比较,并且不移动元素,算法就可以结束排序。因此,冒泡排序算法的最佳时间复杂度为 O(n)。
- 最坏时间复杂度:O(n*n)。最差的情况下(初始时序列已经是降序排列,或者最小值元素处在序列的最后),则需要进行 n 趟排序,总共进行
次元素之间的比较,因此,冒泡排序算法的最坏时间复杂度为 O(n*n)。
- 空间复杂度:O(1)。冒泡排序为原地排序算法,只用到指针变量 i、j 以及标志位 flag 等常数项的变量。
- 冒泡排序适用情况:冒泡排序方法在排序过程中需要移动较多次数的元素,并且排序时间效率比较低。因此,冒泡排序方法比较适合于参加排序序列的数据量较小的情况,尤其是当序列的初始状态为基本有序的情况。
- 排序稳定性:由于元素交换是在相邻元素之间进行的,不会改变相等元素的相对顺序,因此,冒泡排序法是一种 稳定排序算法。
相关文章:

数据结构-冒泡排序(Python)
目录 冒泡排序算法思想 冒泡排序算法步骤 冒泡排序代码实现 冒泡排序算法分析 冒泡排序算法思想 冒泡排序(Bubble Sort)基本思想: 经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面…...
Java单例模式详解:实现线程安全的全局访问点
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式? 单例模式(Singleton Pattern)是一种创建型设计模式,它保证一个类仅有一个实例ÿ…...
React-组件和props
1、类组件 import React from react; class ClassApp extends React.Component {constructor(props) {super(props);this.state{};}render() {return (<div><h1>这是一个类组件</h1><p>接收父组件传过来的值:{this.props.name}</p>&…...
Java面试:从Spring Boot到微服务的全面考核
Java面试:从Spring Boot到微服务的全面考核 场景设定: 在一家互联网大厂的面试室内,严肃的面试官正准备开始对前来面试的赵大宝进行技术考核。赵大宝是一位自称在Java开发方面经验丰富的求职者,不过却是个搞笑的水货程序员。 第…...

深入理解React高阶组件(HOC):原理、实现与应用实践
组件复用的艺术 在React应用开发中,随着项目规模的增长,组件逻辑的复用变得越来越重要。传统的组件复用方式如组件组合和props传递在某些复杂场景下显得力不从心。高阶组件(Higher-Order Component,简称HOC)作为React中…...

Neo4j社区版在win下安装教程(非docker环境)
要在 Windows 10 上安装 Neo4j 社区版数据库并且不使用 Docker Desktop,你可以按照以下步骤操作: 1. 安装 Java Development Kit (JDK) Neo4j 需要 Java 运行环境。推荐安装 JDK 17 或 JDK 11(请根据你下载的 Neo4j 版本查看具体的兼容性要…...
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
文章目录 DIY 实战:从扫雷小游戏开发再探问题分解能力3 问题分解实战(自顶向下)3.2 页面渲染逻辑3.3 事件绑定逻辑 4 代码实现(自底向上)4.1 页面渲染部分4.2 事件绑定部分 写在前面 本篇将利用《Learn AI-assisted Py…...
使用PHP对接印度尼西亚股票市场
在本篇文章中,我们将介绍如何使用PHP语言与StockTV API接口对接,获取并处理印度尼西亚(Indonesia)的股票市场数据。我们将以查询IPO信息和查看涨跌排行榜为例,展示具体的操作流程。 准备工作 首先,确保您…...

如何在 Odoo 18 中配置自动化动作
如何在 Odoo 18 中配置自动化动作 Odoo是一款多功能的业务管理平台,旨在帮助各种规模的企业更高效地处理日常运营。凭借其涵盖销售、库存、客户关系管理(CRM)、会计和人力资源等领域的多样化模块,Odoo 简化了业务流程,…...

node.js 实战——(Http 知识点学习)
HTTP 又称为超文本传输协议 是一种基于TCP/IP的应用层通信协议;这个协议详细规定了 浏览器 和万维网 服务器 之间互相通信的规则。协议中主要规定了两个方面的内容: 客户端:用来向服务器发送数据,可以被称之为请求报文服务端&am…...

新市场环境下新能源汽车电流传感技术发展前瞻
新能源革命重构产业格局 在全球碳中和战略驱动下,新能源汽车产业正经历结构性变革。国际清洁交通委员会(ICCT)最新报告显示,2023年全球新能源汽车渗透率突破18%,中国市场以42%的市占率持续领跑。这种产业变革正沿着&q…...
系统重装——联想sharkbay主板电脑
上周给一台老电脑重装系统系统,型号是lenovo sharkbay主板的电脑,趁着最近固态便宜,入手了两块长城的固态,装上以后插上启动U盘,死活进不去boot系统。提示 bootmgr 缺失,上网查了许久,终于解决了…...
CentOS 7.9升级OpenSSH到9.9p2
初始版本 ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 1.安装编译依赖 yum install -y gcc perl make zlib-devel pam-devel openssl-devel wget 2.升级OpenSSL到1.1.1版本 2.1 备份当前OpenSSL配置 sudo cp -r /usr/bin/openssl /usr/bin/openssl.bak sudo …...

fastjson使用parseObject转换成JSONObject出现将字符特殊字符解析解决
现象:将字符串的${TARGET_VALUE}转换成NULL字符串了问题代码: import com.alibaba.fastjson.JSON;JSONObject config JSON.parseObject(o.toString()); 解决方法: 1.更换fastjson版本 import com.alibaba.fastjson2.JSON;或者使用其他JS…...
37、aiomysql实操习题
练习题1:慢查询优化 题目描述 将以下低效查询优化为索引查询: # 原始低效查询 await cursor.execute("SELECT * FROM orders WHERE YEAR(created_at)2023")参考答案 # 优化后查询(使用索引范围扫描) await cursor.e…...
Rust 2025:内存安全革命与异步编程新纪元
Rust 2025 Edition通过区域内存管理、泛型关联类型和零成本异步框架三大革新,重新定义系统级编程语言的能力边界。本次升级不仅将内存安全验证效率提升80%,更通过异步执行器架构优化实现微秒级任务切换。本文从编译器原理、运行时机制、编程范式转型三个…...

【安装neo4j-5.26.5社区版 完整过程】
1. 安装java 下载 JDK21-windows官网地址 配置环境变量 在底下的系统变量中新建系统变量,变量名为JAVA_HOME21,变量值为JDK文件夹路径,默认为: C:\Program Files\Java\jdk-21然后在用户变量的Path中,添加下面两个&am…...
开关电源实战(六)STM32数控电源BuckBoost
文章目录 芯片手册详解栅极驱动器EG3112栅极驱动芯片2EDF7275K隔离式MOS栅极驱动器运放检测电流GS8558MCP6022打板测试硬件设计PID测试存在的问题参考:基于STM32的同步整流Buck-Boost数字电源 开源 芯片手册详解 栅极驱动器 EG3112栅极驱动芯片 (较低芯片,一个四五毛) …...
Vue3项目中 npm 依赖安装 --save 与 --save-dev 的区别解析
这两个命令的区别如下: bash npm install --save types/crypto-js # 安装到 dependencies(生产依赖) npm install --save-dev types/crypto-js # 安装到 devDependencies(开发依赖) 核心区别 依赖分类不同…...
Oracle 数据库中的 JSON:性能注意事项
本文为白皮书“JSON in Oracle Database: Performance Considerations”的翻译及阅读笔记。 目的 本文档概述了在 Oracle 数据库中存储和处理的 JavaScript 对象表示法 (JSON) 的性能调优最佳实践。应用这些最佳实践将使开发人员、数据库管理员和架构师能够主动避免性能问题&…...

机器人项目管理新风口:如何高效推动智能机器人研发?
在2025年政府工作报告中,“智能机器人”首次被正式纳入国家发展战略关键词。从蛇年春晚的秧歌舞机器人惊艳亮相,到全球首个人形机器人马拉松的热议,智能机器人不仅成为科技前沿的焦点,也为产业升级注入了新动能。而在热潮背后&…...

【Linux】网络基础和socket(4)
1.网络通信(app\浏览器、小程序) 2.网络通信三要素: IP:计算机在网络上唯一标识(ipv4:4个字段,每段最大255 IPV6:16进制) 端口:计算机应用或服务唯一标识 ssh提供远程安全连接…...

大数据可能出现的bug之flume
一、vi /software/flume/conf/dir_to_logger.conf配置文件 问题的关键: Dir的D写成了小写 另一个终端里面的东西一直在监听状态下无法显示 原来是vi /software/flume/conf/dir_to_logger.conf里面的配置文件写错了 所以说不是没有source参数的第三行的原因 跟这个没关系 …...

图解Mysql原理之全局锁,表级锁,行锁了解吗?
前言 大家好,我是程序蛇玩编程。 Mysql中的锁大家都用过吗,那全局锁,表锁,行锁哪个用的频率最多呢? 正文 全局锁: 全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables wi…...
JavaScript 的“世界模型”:深入理解对象 (Objects)
引言:超越简单值,构建复杂实体 到目前为止,我们学习的变量大多存储的是单一的值,比如一个数字 (let age 30;)、一个字符串 (let name "Alice";) 或一个布尔值 (let isActive true;)。这对于简单场景足够了&am…...

Java集成【邮箱验证找回密码】功能
目录 1.添加依赖 2.选择一个自己的邮箱,作为发件人角色。 3.编写邮箱配置【配置发件人邮箱】 4.编写邮箱配置类 5.编写controller业务代码 6.演示效果 7.总结流程 8.注意 结语 一.发送邮箱验证码 1.添加依赖 <!--导入邮箱依赖--> <dependency&g…...

HarmonyOS 5.0应用开发——MVVM模式的应用
【高心星出品】 文章目录 MVVM模式的应用ArkUI开发模式图架构设计原则案例运行效果项目结构功能特性开发环境model层viewmodel层view层 MVVM模式的应用 MVVM(Model-View-ViewModel)模式是一种广泛用于应用开发的架构模式,它有助于分离应用程…...

程序员鱼皮最新项目-----AI超级智能体教程(一)
文章目录 1.前言1.什么是AI大模型2.什么是多模态3.阿里云百炼平台介绍3.1文本调试展示3.2阿里云和dashscope的关系3.3平台智能体应用3.4工作流的创建3.5智能体编排应用 1.前言 最近鱼皮大佬出了一套关于这个AI 的教程,关注鱼皮大佬很久了,鱼皮大佬确实在…...

【AI模型学习】双流网络——更强大的网络设计
文章目录 一 背景1.1 背景1.2 研究目标 二 模型2.1 双流架构2.2 光流 三 实验四 思考4.1 多流架构4.2 fusion策略4.3 fusion的early与late 先简单聊了双流网络最初在视频中的起源,之后把重点放在 “多流结构"和"fusion” 上。 一 背景 1.1 背景 Two-Str…...

HarmonyOS:一多能力介绍:一次开发,多端部署
概述 如果一个应用需要在多个设备上提供同样的内容,则需要适配不同的屏幕尺寸和硬件,开发成本较高。HarmonyOS 系统面向多终端提供了“一次开发,多端部署”(后文中简称为“一多”)的能力,可以基于一种设计…...