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

讲解一下冒泡排序

问题

讲解一下冒泡排序

我的回答

冒泡排序其实是最基础的排序算法之一,它的名字很形象,就像水里的气泡往上冒一样,大的元素会慢慢"冒"到数组的后面。

基本思路是这样的:

我们每次都比较相邻的两个元素,如果前面的比后面的大,就把它们交换位置。这样一轮下来,最大的元素就会被"冒"到最后面。然后我们再重复这个过程,第二大的元素就会到倒数第二的位置,以此类推。

具体步骤:

  1. 从第一个元素开始,比较相邻的两个元素
  2. 如果左边比右边大,就交换它们
  3. 继续向右比较,直到这一轮结束
  4. 重复上面的过程,但每次可以少比较一个元素

假设我们要排序数组:[5, 2, 8, 1, 9]

第一轮冒泡:

  • 比较 5 和 2:5 > 2,交换 → [2, 5, 8, 1, 9]
  • 比较 5 和 8:5 < 8,不交换 → [2, 5, 8, 1, 9]
  • 比较 8 和 1:8 > 1,交换 → [2, 5, 1, 8, 9]
  • 比较 8 和 9:8 < 9,不交换 → [2, 5, 1, 8, 9]

第一轮结束,最大的数 9 已经"冒"到最后了。

第二轮冒泡:

  • 比较 2 和 5:2 < 5,不交换 → [2, 5, 1, 8, 9]
  • 比较 5 和 1:5 > 1,交换 → [2, 1, 5, 8, 9]
  • 比较 5 和 8:5 < 8,不交换 → [2, 1, 5, 8, 9]

第二轮结束,第二大的数 8 到了倒数第二位。

第三轮冒泡:

  • 比较 2 和 1:2 > 1,交换 → [1, 2, 5, 8, 9]
  • 比较 2 和 5:2 < 5,不交换 → [1, 2, 5, 8, 9]

第四轮冒泡:

  • 比较 1 和 2:1 < 2,不交换 → [1, 2, 5, 8, 9]

最终结果:[1, 2, 5, 8, 9]

就像气泡一样,每一轮都有一个最大的数"冒"到它应该在的位置,这就是冒泡排序名字的由来!

时间复杂度是O(n²),因为有两层循环。最好情况下如果数组已经有序,我们可以优化到O(n)。空间复杂度是O(1),因为只用了常数级别的额外空间。

#include <iostream>
#include<vector>
void bubbleSort(std::vector<int>& nums)
{int start = nums[0];int n = nums.size();for (int i = 0; i < n; i++){for (int j = 0; j < n - i-1; j++){if (nums[j] > nums[j+1]){std::swap(nums[j], nums[j + 1]);}}}
}int main()
{std::vector<int> nums = { 5,2,1,6,4,8 };bubbleSort(nums);for (auto& num : nums){std::cout << num << std::endl;}return 0;
}

这个代码可以优化,优化的逻辑就是:如果某一轮没有发生交换,说明数组已经有序,可以提前结束

比如说

void bubbleSort(std::vector<int>& nums)
{int n = nums.size();for (int i = 0; i < n - 1; i++){bool swapped = false;  // 标记这一轮是否发生交换for (int j = 0; j < n - i - 1; j++){if (nums[j] > nums[j + 1]){std::swap(nums[j], nums[j + 1]);swapped = true;}}if (!swapped) break;  // 如果没有交换,提前退出}
}

文章转载自:

http://81OOmxF5.prgrh.cn
http://XP2SQM1f.prgrh.cn
http://AtZjHTpt.prgrh.cn
http://bTierdNv.prgrh.cn
http://Pj89i7LD.prgrh.cn
http://4VrKiNxg.prgrh.cn
http://z7STQFRe.prgrh.cn
http://GUsPOQjC.prgrh.cn
http://BMJKASDy.prgrh.cn
http://81RUU2Vj.prgrh.cn
http://EWhfEery.prgrh.cn
http://mL6hfFNJ.prgrh.cn
http://Hr96rUNe.prgrh.cn
http://f9NaZiz9.prgrh.cn
http://qb4gfx0S.prgrh.cn
http://P3OwBwUi.prgrh.cn
http://bBuPZyWr.prgrh.cn
http://6GOysQA4.prgrh.cn
http://pKk9BMIa.prgrh.cn
http://BZWke8fK.prgrh.cn
http://SMRAO8Vu.prgrh.cn
http://7lflKBvr.prgrh.cn
http://0CxHFXyC.prgrh.cn
http://QXGiVFaR.prgrh.cn
http://hlUkFdpk.prgrh.cn
http://214q7sUv.prgrh.cn
http://6rIF97Bx.prgrh.cn
http://kA6IQA6y.prgrh.cn
http://aplr65W4.prgrh.cn
http://pT3BD3m6.prgrh.cn
http://www.dtcms.com/a/370907.html

相关文章:

  • 【基础-单选】关于容器组件Row和Column,下面说法错误的是
  • 【佳易王药品进销存软件实测】:操作简单 + 全流程管理,医药台账管理好帮手#软件教程全解析
  • 项目升级--Nginx
  • HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树
  • 修复存在坏块或05、C4、C5 S.M.A.R.T错误的硬盘
  • LwIP入门实战 — 4 LwIP的网络接口管理
  • rapidocr v3.4.0发布了
  • 硬件开发_基于物联网的老人跌倒监测报警系统
  • ARM体系结构学习①
  • 【LeetCode热题100道笔记】验证二叉搜索树
  • 垃圾收集器分类
  • AQS原理
  • Nestjs框架: 使用 CASL 库实现基于角色的权限控制(RBAC)与细粒度访问控制的实战演示
  • 计算机主板上的那颗纽扣电池的作用是什么?
  • 【Java实战㉗】Java日志框架实战:Logback与Log4j2的深度探索
  • 【关于线程的一些总结】
  • PyQt5 入门(上):开启 GUI 编程之旅
  • 本体论中的公理与规则——从经典逻辑到神经符号融合的演进
  • linux 内核 - 内核设计原则
  • Vue3中SCSS的使用指南
  • 音转文模型对比FunASR与Faster_whisper
  • 【YOLOv11】3.Pycharm配置
  • 常用配置文件
  • MySQL运维补充
  • JVM中如何调优新生代和老生代?
  • Transformer 架构的演进与未来方向(RNN → Self-Attention → Mamba)——李宏毅大模型2025第四讲笔记
  • 企业级监控方案对比:Zabbix vs Prometheus
  • 【Kubernetes】知识点总结6
  • 力扣3495. 使数组元素都变为零的最少操作次数 详解
  • 新能源研发,用新型实验记录本:ELN