经典算法之美:冒泡排序的优雅实现

  • 基本概念
  • 工作原理
    • 介绍
    • 具体实现
  • 代码实现
  • 总结

基本概念

冒泡排序是一种简单的排序算法,通过重复比较相邻的元素并交换它们的位置来实现排序。它的名称来源于较小的元素像气泡一样逐渐“浮”到数组的顶端。

工作原理

介绍

冒泡排序是交换排序的一种,了解其基本思想对学习这种算法至关重要。

所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。重复这个过程直到整个数组有序。

具体实现

在这里插入图片描述

以该数组为例,我们每次只关注相邻两个元素的大小关系

  1. 我们先关注3和44,很明显,此时的数组[3,44]是有序的,无需交换
    在这里插入图片描述

  2. 此时,44和38需要交换
    在这里插入图片描述
    在这里插入图片描述
    此时数组[3,38,44]有序,从44的位置继续向后比较

  3. 找到44和5时同理,需要交换44和5保证升序顺序
    在这里插入图片描述
    在这里插入图片描述
    你可能疑问?此时数组[3,38,5,44]不是有序的!
    不要紧,我们先继续往后交换

  4. 我们省略几步,直接来看这趟比较的结束状态
    在这里插入图片描述
    此时我们发现,数组中最大的元素47来到了最后面,这就是单趟冒泡排序的效果,一次选出数组中最大或最小的一个数放到应该在的位置上

  5. 我们来分析此时的数组
    在这里插入图片描述
    数组被红线分割,红线左边为无序区,右边为有序区。
    此时的效果可能不明显,我们再模拟几次交换
    在这里插入图片描述
    目前我们又执行了两次交换,可以看到:有序区的在增加,无序区在减少
    意识到这点之后,你就已经明白了冒泡排序的原理了:通过重复遍历无序区,对相邻元素依次比较并交换逆序对,使当前无序区的最值逐步‘浮’到其最终位置;每轮结束后,无序区长度减 1;直至无序区仅剩 1 个元素时,数组完全有序。

代码实现

因为冒泡排序是较为简单的经典排序算法,我们直接来看代码实现。

void BubbleSort(int arr[], int n)
{if (n <= 1) return;int i, j;for (int i = n - 1; i >= 0; i--){for (int j = 0; j < i; j++){if (arr[j] > arr[j + 1]){swap(arr[j], arr[j + 1]);}}}
}

最坏情况:数组完全逆序,需要进行 n(n-1)/2 次比较和交换,时间复杂度O(N^2)

此时可以对冒泡排序做出优化

void BubbleSort(int arr[], int n)
{if (n <= 1) return;int i, j;for (int i = n - 1; i >= 0; i--){bool flag = false;for (int j = 0; j < i; j++){if (arr[j] > arr[j + 1]){swap(arr[j], arr[j + 1]);flag = true;}}if (flag == false)break;}
}

通过提前终止优化,如果在某次循环中没有发生元素交换,代表此时数组已经有序,直接退出。此时为最优情况,仅需一次遍历,时间复杂度为 O(N)

总结

冒泡排序是入门级排序算法,核心是通过相邻元素比较交换,让最值逐步 “浮” 到对应位置,随无序区收缩实现有序。​
其时间复杂度为 O (n²)(优化后最好情况 O (n)),空间复杂度 O (1),是稳定排序。优势在于简单易实现,适配接近有序数据;但效率偏低,仅适合小规模场景。​
虽被高效算法替代,但其迭代逻辑仍是理解排序本质的基础

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

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

相关文章

click和touch事件触发顺序 糊里糊涂解决的奇怪bug

问题详情 在嵌入式硬件设备里&#xff0c;测试 “点击input密码框&#xff0c;弹出第三方自带键盘&#xff0c;点击密码框旁的小眼睛&#xff0c;切换输入内容加密状态&#xff0c;键盘收起/弹出状态不变” 的功能逻辑&#xff1b;实际情况却是 “点击键盘或input框之外的任何地…

【0基础PS】Photoshop (PS) 理论知识

目录前言一、Photoshop 核心概念与定位​二、图像基础理论​三、图层理论&#xff1a;PS 的核心工作机制​四、选区与蒙版​五、调色核心理论​六、常用文件格式​学习建议​总结前言 在数字图像编辑领域&#xff0c;Photoshop&#xff08;简称 PS&#xff09;无疑是行业标杆级…

数据库 设计 pdm comment列表显示和生成建表sql

按如下步骤 生成见建表语句 comment非空使用comment 生成字段注释&#xff0c; 空的时候使用name 生成字段注释 sql脚本模板编辑 参考 PowerDesigner生成mysql字段comment 注释-腾讯云开发者社区-腾讯云 版本不同这边的设置不同 这个勾打上

嵌入式基础知识复习(C语言)

知识扩展7.28 嵌入式产品特点、开发环境、计算机组成、Linux终端初识1、嵌入式产品。特点&#xff1a;低功耗、根据用户需求定制。硬件&#xff1a;arm处理器。软件&#xff1a;Linux操作系统arm架构&#xff1a;精简指令集、低功耗&#xff08;移动/嵌入式&#xff09;。 …

LeetCode Hot 100 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (mn)) 。示例 1&#xff1a;输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释&#x…

监控场景视频质量异常修复:陌讯动态增强算法实战解析

原创声明&#xff1a;本文为原创技术解析&#xff0c;核心技术参数与架构引用自《陌讯技术白皮书》&#xff0c;禁止未经授权转载。一、行业痛点&#xff1a;视频质量异常的连锁难题在安防监控、智慧交通等场景中&#xff0c;视频质量异常已成为 AI 分析的主要瓶颈。据行业报告…

一个简单的mvvm示例与数据双向绑定

这就是一个简单的数据双向绑定的demo&#xff0c;参考即可&#xff08;cmakelist我没按他的写&#xff0c;但是大差不差&#xff09; 目录 1.示例demo File: CMakeLists.txt File: main.cpp File: model/physiologymodel.cpp File: viewmodel/physiologyviewmodel.h Fil…

哈希的概念及其应用

哈希的概念及其应用哈希概念常见的哈希其他哈希字符串哈希&#xff08;算法竞赛常用&#xff09;字符串哈希OJP3370 【模板】字符串哈希 - 洛谷P10468 兔子与兔子 - 洛谷哈希冲突哈希函数设计原则哈希冲突解决方法—闭散列闭散列的线性探测闭散列的二次探测哈希冲突解决方法—开…

【分布式的个人博客部署】

综合项目-搭建个人博客一、运行环境二、基础配置三、业务需求第一步&#xff1a;准备工作1、配置静态IP2、修改hosts映射3、开启防火墙4、时间同步5、配置免密ssh登录第二步&#xff1a;环境搭建1、Server-web端安装LNMP环境软件2、Server-NFS-DNS端上传博客软件3、Server-NFS-…

蓝桥杯----DS18B20温度传感器

&#xff08;二&#xff09;、温度传感器1、One-Wire总线One-Wire总线利用一根线实现双向通信。因此其协议对时序的要求较严格&#xff0c;如应答等时序都有明确的时间要求。基本的时序包括复位及应答时序、写一位时序读一位时序。单总线即只有一根数据线&#xff0c;系统中的数…

科技赋能成长 脑力启迪未来

——西安臻昊科技与秦岭云数智共筑脑科学教育新生态 2025年6月26日&#xff0c;西安臻昊科技&#xff08;集团&#xff09;有限责任公司与秦岭云数智&#xff08;陕西&#xff09;科技有限公司正式签署脑象评测技术战略合作协议&#xff0c;双方将依托技术互补与资源协同&#…

Docker部署的PostgreSQL慢查询日志配置指南

目录 1. 核心步骤 1.1 修改配置文件 1.2 动态加载配置&#xff08;无需重启容器&#xff09; 1.3 验证配置生效 1.3.1 查看参数 1.3.2 执行测试慢查询 2. 高级用法 2.1 使用分析工具 2.2 启用扩展 3. 注意事项 3.1 日志目录权限 3.2 性能影响 配置Docker部署的Pos…

C# 入门教程(四)委托详解

文章目录1、什么是委托2、委托的声明&#xff08;自定义委托&#xff09;3、委托的使用3.1 实例:把方法当作参数传给另一个方法3.2 注意:难精通易使用功能强大东西&#xff0c;一旦被滥用则后果非常严重4、委托的高级使用4.1 多播&#xff08;multicast&#xff09;委托4.2隐式…

React的基本语法和原理

3. React条件渲染某些情况下&#xff0c;姐妹的内容会根据不同的情况显示不同的内容&#xff0c;或者决定是否渲染某部分内容&#xff1a; 在React中&#xff0c;所有的条件判断和普通的JavaScript代码一致&#xff1b;常见的条件渲染的方式有哪些&#xff1f;方式一&#xff1…

如何在 Gradle 项目中添加依赖?(以添加 AndroidX 版本的 RecyclerView 为例)

1. 确保项目已启用 AndroidX RecyclerView 的现代版本属于 AndroidX 库&#xff0c;需确保项目已启用 AndroidX&#xff1a; 在 gradle.properties 中应有以下配置&#xff08;通常新建项目默认开启&#xff09;&#xff1a;android.useAndroidXtrue android.enableJetifiert…

深度学习与图像处理 | 基于PaddlePaddle的梯度下降算法实现(线性回归投资预测)

演示基于PaddlePaddle自动求导技术实现梯度下降&#xff0c;简化求解过程。01、梯度下降法梯度下降法是机器学习领域非常重要和具有代表性的算法&#xff0c;它通过迭代计算来逐步寻找目标函数极小值。既然是一种迭代计算方法&#xff0c;那么最重要的就是往哪个方向迭代&#…

负载均衡集群HAproxy

HAProxy 简介HAProxy 是一款高性能的负载均衡器和代理服务器&#xff0c;支持 TCP 和 HTTP 应用。广泛用于高可用性集群&#xff0c;能够有效分发流量到多个后端服务器&#xff0c;确保服务的稳定性和可扩展性。HAProxy 核心功能负载均衡&#xff1a;支持轮询&#xff08;round…

重生之我在10天内卷赢C++ - DAY 1

坐稳了&#xff0c;我们的C重生之旅现在正式发车&#xff01;请系好安全带&#xff0c;前方高能&#xff0c;但绝对有趣&#xff01;&#x1f680; 重生之我在10天内卷赢C - DAY 1导师寄语&#xff1a;嘿&#xff0c;未来的编程大神&#xff01;欢迎来到C的世界。我知道&#x…

[mind-elixir]Mind-Elixir 的交互增强:单击、双击与鼠标 Hover 功能实现

[mind-elixir]Mind-Elixir 的交互增强&#xff1a;单击、双击与鼠标 Hover 功能实现 功能简述 通过防抖&#xff0c;实现单击双击区分通过mousemove事件&#xff0c;实现hover效果 实现思路 &#xff08;一&#xff09;单击与双击事件 功能描述 单击节点时&#xff0c;可以触发…

c++-迭代器类别仿函数常用算法函数

C常用算法函数 1. 前置知识 1.1 迭代器的类别 C中&#xff0c;迭代器是 STL 容器库的核心组件之一&#xff0c;具有举足轻重的作用&#xff0c;它提供了一种 统一的方式来访问和遍历容器&#xff0c;而无需关心底层数据结构的具体实现。迭代器类似指针&#xff0c;但比指针更通…