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

【算法】冒泡排序

目录

一、算法概述

二、算法原理

1. 核心思想

2. 排序过程演示

三、标准实现代码

四、时间复杂度分析

五、优化策略

1. 提前终止优化

2. 记录最后交换位置

六、算法特性

七、实际应用

八、扩展思考

九、总结


一、算法概述

冒泡排序(Bubble Sort)是最经典的排序算法之一,其名称源于元素移动方式如同水中气泡上浮的过程。这个简单直观的算法诞生于1956年,至今仍是计算机科学入门教育的经典案例。

二、算法原理

1. 核心思想

通过相邻元素的比较和交换,使较大元素逐步"浮"到数列末端。每一轮排序将确定一个元素的最终位置,类似于气泡从水底升到水面。

2. 排序过程演示

以数组 [5, 3, 8, 1, 2] 为例:

初始:5 3 8 1 2
第1轮:
3 5 8 1 2 → 比较5和3
3 5 1 8 2 → 比较8和1
3 5 1 2 8 → 比较8和2(确定最大值8)第2轮:
3 1 5 2 8 → 比较5和1
3 1 2 5 8 → 比较5和2(确定次大值5)第3轮:
1 3 2 5 8 → 比较3和1
1 2 3 5 8 → 比较3和2(确定中间值3)第4轮:
1 2 3 5 8 → 比较2和1(完全有序)

三、标准实现代码

def bubble_sort(arr):n = len(arr)for i in range(n):# 每次减少比较范围for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr

四、时间复杂度分析

  • 最好情况(已有序):O(n) (优化版)

  • 平均情况:O(n²)

  • 最坏情况(完全逆序):O(n²)

空间复杂度:O(1)(原地排序)

五、优化策略

1. 提前终止优化

def optimized_bubble_sort(arr):n = len(arr)for i in range(n):swapped = Falsefor j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = Trueif not swapped:breakreturn arr

2. 记录最后交换位置

def improved_bubble_sort(arr):n = len(arr)last_swap = n - 1while last_swap > 0:new_swap = 0for j in range(last_swap):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]new_swap = jlast_swap = new_swapreturn arr

六、算法特性

  • 稳定性:稳定排序(相同元素相对位置不变)

  • 适用场景:

    • 小规模数据排序

    • 教学演示用途

    • 数据基本有序时表现良好

  • 缺点:

    • 大规模数据效率低下

    • 元素移动次数较多

七、实际应用

  1. 硬件资源受限的嵌入式系统

  2. 图形界面中的简单数据排序

  3. 其他排序算法的基准测试对比

  4. 链表数据的排序(相比数组更具优势)

八、扩展思考

  1. 双向冒泡排序(鸡尾酒排序):交替进行正向和反向遍历

  2. 结合插入排序的混合算法

  3. 并行化处理的可能性

九、总结

冒泡排序虽不是最高效的排序算法,但其简明性使其成为:

  • 理解排序思想的绝佳范例

  • 算法优化的典型研究对象

  • 其他高级排序算法的基础参照

在真实开发中,当数据规模超过1000时建议使用更高效的算法(如快速排序、归并排序)。但对于算法学习者,深入理解冒泡排序将有助于建立基础的算法思维模式。

附录:不同语言实现示例

// Java实现
public static void bubbleSort(int[] arr) {boolean swapped;for (int i = 0; i < arr.length-1; i++) {swapped = false;for (int j = 0; j < arr.length-i-1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;swapped = true;}}if (!swapped) break;}
}

相关文章:

【算法】冒泡排序

目录 一、算法概述 二、算法原理 1. 核心思想 2. 排序过程演示 三、标准实现代码 四、时间复杂度分析 五、优化策略 1. 提前终止优化 2. 记录最后交换位置 六、算法特性 七、实际应用 八、扩展思考 九、总结 一、算法概述 冒泡排序&#xff08;Bubble Sort&#xff0…...

R Excel 文件:高效数据处理的利器

R Excel 文件:高效数据处理的利器 在数据分析领域,R语言因其强大的统计分析和可视化功能而备受推崇。而R Excel文件,作为R语言与Excel的桥梁,使得数据在R和Excel之间的高效转换成为可能。本文将详细介绍R Excel文件的概念、应用场景以及操作方法。 一、R Excel文件的概念…...

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令 命令解释 SHOW DATABASES&#xff1b; 展示所有的数据库 CREATE DATABASE 数据…...

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机&#xff0c;主要为上下级控制系统之间的广域网通信提供认证与加密服务&#xff0c;实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证&#xff1a;对接入的设备和用户…...

vue:vite 代理服务器 proxy 配置

Vite 代理服务器&#xff08;Proxy&#xff09;的配置通常用于开发环境&#xff0c;以解决跨域请求等问题。以下是一个详细的配置步骤&#xff1a; 通过以上步骤&#xff0c;你就可以在 Vite 项目中配置代理服务器&#xff0c;以便在开发过程中方便地访问后端服务。 ‌找到 Vi…...

Java【网络原理】(2)初识网络续与网络编程

目录 1.前言 2.正文 2.1TCP协议与UDP协议 2.2socket API进行网络编程 2.2.1DatagramPacket类 2.2.1.1发送数据报 2.2.1.2接收数据报 2.2.1.3获取数据报内容 2.2.1.4设置数据报内容 2.2.2DatagramSocket类 2.2.2.1构造方法 2.2.2.2常用方法 2.2.3具体代码与解释 3…...

AI+集装箱号码识别技术,主要发展方向和应用潜力

集装箱号码识别技术作为物流数字化的重要工具&#xff0c;其应用前景随着全球供应链的智能化升级和绿色转型需求不断扩大。结合当前技术发展和行业实践&#xff0c;以下是其未来的主要发展方向和应用潜力&#xff1a; 1.物流与港口智能化管理 自动化识别与效率提升&#xff1…...

安装可视化jar包部署平台JarManage

一、下载 下载地址&#xff1a;JarManage 发行版 - Gitee.com &#x1f692; 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器&#xff0c;解压进入目录 &#x1f69a; 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...

后端之JPA(EntityGraph+JsonView)

不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表&#xff0c;然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码&#xff0c;而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...

Java数据结构第十三期:走进二叉树的奇妙世界(二)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、二叉树的遍历 1.1. 前序遍历 1.2. 中序遍历 1.3. 后序遍历 1.4. 完整代码 二、二叉树的基本操作 2.1. 获取树中结点个数 2.1. 获取叶子结点个数 2.3. 获取第k层结点的个数 2.4. 获取二叉树的…...

JavaScript系列(86)--现代构建工具详解

JavaScript 现代构建工具详解 &#x1f528; 现代前端开发离不开构建工具&#xff0c;它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;构建工具主要解决代码转换…...

docker容器网络配置及常用操作

Linux内核实现名称空间的创建 ip netns&#xff08;网络名称空间&#xff09;命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包&#xff0c;一般系统会默认安装&#xff0c;如果没有的话&#xff0c;请自行安装。 注意&am…...

Docker 性能优化指南

Docker 提供了强大的容器化功能&#xff0c;能够帮助开发者在不同的环境中构建、测试和部署应用。然而&#xff0c;随着容器化应用的不断增长&#xff0c;Docker 容器可能会面临一些性能瓶颈&#xff0c;影响其运行效率、资源占用和扩展能力。为了确保容器在生产环境中的高效运…...

课程1. 深度学习简介

课程1. 深度学习简介 神经网络结构逻辑回归XOR问题&#xff08;异或问题&#xff09; 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材…...

【cuda学习日记】4.3 结构体数组与数组结构体

4.3 数组结构体&#xff08;AoS&#xff09;和结构体数组&#xff08;SoA&#xff09; AoS方法进行存储 struct innerStruct{float x;float y; };struct innerStruct myAOS[N];SoA方法来存储数据 struct innerArray{float x[N];float y[N]; };struct innerArray moa;如图说明…...

2025最新高维多目标优化:基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码

一、基于导航变量的多目标粒子群优化算法&#xff08;NMOPSO&#xff09;介绍 基于导航变量的多目标粒子群优化算法&#xff08;Navigation variable-based multi-objective particle swarm optimization&#xff0c;NMOPSO&#xff09;是2025年提出的一种用于无人机路径规划的…...

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…...

Linux内核,slub分配流程

我们根据上面的流程图&#xff0c;依次看下slub是如何分配的 首先从kmem_cache_cpu中分配&#xff0c;如果没有则从kmem_cache_cpu的partial链表分配&#xff0c;如果还没有则从kmem_cache_node中分配&#xff0c;如果kmem_cache_node中也没有&#xff0c;则需要向伙伴系统申请…...

本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)

安装Ollama 打开 Ollama官网 https://ollama.com/下载安装 Ollama服务默认只允许本机访问&#xff0c;修改允许其它主机访问 OLLAMA_HOST0.0.0.0 ollama serve也可以添加系统环境变量 都知道模型体积很大&#xff0c;顺便也通过环境变量修改模型存放位置&#xff0c;我这…...

Java 实现快速排序算法:一条快速通道,分而治之

大家好&#xff0c;今天我们来聊聊快速排序&#xff08;QuickSort&#xff09;算法&#xff0c;这个经典的排序算法被广泛应用于各种需要高效排序的场景。作为一种分治法&#xff08;Divide and Conquer&#xff09;算法&#xff0c;快速排序的效率在平均情况下非常高&#xff…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...