数据结构和算法|排序算法系列(二)|冒泡排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知:
《Hello算法之排序算法》

主要内容来自:Hello算法11.3 冒泡排序

我觉得冒泡排序非常有意思,也非常简单,就是不停地交换相邻的元素即可,最大的元素一直横冲直撞往右边过去。

然后我们再经过 n-1 次迭代即可找出顺序规律。

单次循环的流程可以看原文的图片:冒泡排序

对于冒泡排序,需要重点掌握的还是效率优化章节。

算法流程

重点就是抓住到底要冒泡几轮,然后就是我们需要把最大的元素冒到最后面去,也就是说我们的未匹配元素是从0开始,到n、n-1、n-2…以此类推,应该如何处理?

对于数组长度为 n ,冒泡排序流程如下:

1.首先,对 n 个元素执行“冒泡” ,将数组的最大元素交换到正确位置
2. 接下来,对剩余 n - 1个元素执行“冒泡”,将第二大元素交换到正确位置
3. 以此类推,一共经过 n - 1轮“冒泡”,前 n - 1 大的元素都被交换到正确位置
4. 仅剩的一个元素必定是最小元素,无须排序,因此数组排序完成。

//版本一:
void bubbleSort(vector<int> &nums) {int n = nums.size();while (--n) {int k = 0; //记录最大元素下标,这样我觉得效率更高,不用频繁swapfor (int i = 1; i <= n; i++) {if (nums[i] > nums[k])k = i;}swap(nums[k], nums[n]);}
}//版本二:
void bubbleSort(vector<int> &nums) {// 外循环:未排序区间为 [0, i]for (int i = nums.size() - 1; i > 0; i--) {// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {// 交换 nums[j] 与 nums[j + 1]// 这里使用了 std::swap() 函数swap(nums[j], nums[j + 1]);}}}
}

⭐️效率优化

在冒泡排序中,完全有可能某轮的冒泡没有执行任何交换操作,说明数组已经完成排序,可以直接返回结果。

所以我们可以增加一个标志位flag来监控该情况,一旦出现立即返回。

经过优化,冒泡排序的最差时间复杂度和平均时间复杂度仍为 O ( n 2 ) O(n^2) O(n2)但当输入数组完全有序时,可达到最佳时间复杂度 O ( n ) O(n) O(n)

//版本一:
void bubbleSort(vector<int> &nums) {int n = nums.size();while (--n) {int k = 0; //记录最大元素下标,这样我觉得效率更高,不用频繁swapint flag = 0;for (int i = 1; i <= n; i++) {if (nums[i] > nums[k]) {k = i;flag++;}}if (!flag)break;swap(nums[k], nums[n]);}
}
//版本二:
void bubbleSortWithFlag(vector<int> &nums) {// 外循环:未排序区间为 [0, i]for (int i = nums.size() - 1; i > 0; i--) {bool flag = false; // 初始化标志位// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {// 交换 nums[j] 与 nums[j + 1]// 这里使用了 std::swap() 函数swap(nums[j], nums[j + 1]);flag = true; // 记录交换元素}}if (!flag)break; // 此轮“冒泡”未交换任何元素,直接跳出}
}

算法特性

  • 时间复杂度为 O ( n 2 ) O(n^2) O(n2)、自适应排序:各轮“冒泡”遍历的数组长度依次为 n − 1 、 n − 2 、 . . . 、 2 、 1 n-1 、n-2、...、2、1 n1n2...21,总和为 ( n − 1 ) n 2 \frac{(n-1)n}{2} 2(n1)n。在引入优化后,最佳时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度为 O ( 1 ) O(1) O(1)、原地排序
  • 稳定排序:由于在“冒泡”中,遇到相等元素不会进行交换。

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

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

相关文章

多天线技术

多天线技术可以分为两类&#xff1a;分集技术和空间复用技术。分集技术利用多天线接收或者发射载有同一信息的信号&#xff0c;提高传输的可靠性。分集技术是将瑞利衰落无线信道换成更加稳定的信道。 发射端未知CSI时的信道容量 发射端已知CSI时的信道容量 信道估计&#xff…

基础—SQL—通用语法及分类

一、SQL的通用基本语法 &#xff08;1&#xff09;SQL语句可以单行或多行书写&#xff08;以分号结尾&#xff09;。 &#xff08;2&#xff09;在编写SQL语句的时候&#xff0c;如果长度比较长&#xff0c;我们可以允许空格/缩进来增强语句的可读性&#xff0c;而且空格或者…

ElasticSearch插件版本与ES版本不对应的解决方案

一、背景 最近需要给es安装ik、hanlp分词器和ingest-attachment管道&#xff0c;服务器已有的es版本为8.5.3&#xff08;似乎太新了&#xff09;&#xff0c;hanlp和ingest-attachment都没有这么高的版本&#xff0c;因此只能下载相对老的版本&#xff0c;然后自己修改配置文件…

安全设计 | 安全设计不得马虎!微软STRIDE威胁建模方法让你事半功倍,快速发现应用安全隐患!

STRIDE威胁建模方法最早发表于2006年11月的《MSDN杂志》&#xff0c;作者是微软的工程师Shawn Hernan、Scott Lambert 、Tomasz Ostwald 和 Adam Shostack。那我们为什么要进行威胁建模&#xff1f; 如何使用数据流图对系统进行威胁建模&#xff1f;如何减轻威胁&#xff1f;接…

java项目之桂林旅游景点导游平台源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的桂林旅游景点导游平台。 项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 桂林旅游景点导游…

mysql5.5版本安装过程

mysql是关系型数据库的管理系统 将安装包放在 c盘根目录 名称为mysql 在该路径下cmd进入命令执行窗口 出现此页面说明安装成功 需要修改配置文件内容 将my-medium.ini 复制粘贴并改名为 my.ini 并添加如下内容 改好之后在mysql目录下cmd进入命令执行窗口 切换到cd bin …

变电站的SCD文件

SCD文件是智能变电站配置描述文件&#xff0c;是IEC 61850标准定义的一种文件类型&#xff0c;用于描述整个变电站所有设备的信息。它包含变电站一次系统配置&#xff08;含一次、二次设备关联信息配置&#xff09;、二次设备配置&#xff08;包含信号描述、GOOSE信号连接配置&…

唠唠叨叨,每日进度

今天学了一个strcpy’的模拟实现&#xff0c;现在需要去写水课作业了&#xff0c;加油&#xff01;&#xff01;&#xff01;

【文末附gpt升级方案】Lumina-T2X:大型扩散DiTs在多模态内容生成中的新篇章

Lumina-T2X&#xff1a;大型扩散DiTs在多模态内容生成中的新篇章 摘要 随着人工智能技术的飞速发展&#xff0c;多模态内容生成已成为计算机视觉和自然语言处理领域的研究热点。本文介绍了Lumina-T2X&#xff0c;一个基于大型扩散变换器&#xff08;Diffusion Transformers, …

Java实现图书系统

首先实现一个图书管理系统,我们要知道有哪些元素? 1.用户分成为管理员和普通用户 2.书:书架 书 3.操作的是: 书架 目录 第一步:建包 第二步:搭建框架 首先:完成book中的方法 其次:完成BookList 然后:完成管理员界面和普通用户界面 最后:Main 第三步:细分方法 1.退…

Spring—Spring配置文件概念及应用(实现一个图形验证码)

文章目录 配置文件配置文件作用配置文件的格式配置文件优先级说明配置文件书写代码的格式yml文件代码的格式 Value注解 properties 缺点分析properties VS yml实现一个验证码程序 配置文件 配置文件作用 整个项目的重要信息我们都会配置在配置文件中&#xff0c;比如说我们数…

视频拼接融合产品的产品与架构设计(四)分布式GPU运算合并单元

上一篇如下 视频拼接融合产品的产品与架构设计(三&#xff09;内存和显存单元数据迁移 视频合并单元说明 对下面这张图做些说明&#xff0c;视频接入是比较常见&#xff0c;可以说是普通&#xff0c;但是做到接入后随即进行比较重的算法运算&#xff0c;这个在视频领域并不多…

Makefile学习笔记14|u-boot顶层Makefile00

Makefile学习笔记14|u-boot顶层Makefile00 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长&#xff0c;谢谢。 这里是目录 本系列文章分析使用的Makefile # SPDX-License-Identifier: GPL-2.0VERSION 2024 PATCHLEVEL 01 SUBLEVEL EXTRAVERSION -rc4 N…

评估SV模型的预测效果和性能因素

评估SV模型的预测效果和性能通常涉及多个方面的考量,以下是一些关键的评估方法和指标: 均方误差(Mean Squared Error, MSE):MSE衡量了模型预测值与实际值之间差异的平方的均值。较小的MSE值意味着模型预测更为准确。 均方根误差(Root Mean Squared Error, RMSE):RMSE是…

SDN简介

一、SDN 定义与概念 SDN&#xff08;Software-defined Networking&#xff0c;软件定义网络&#xff09;是一种新型网络管理方法&#xff0c;支持动态可编程的网络配置&#xff0c;提高了网络性能和管理效率&#xff0c;使网络服务能够像云计算一样提供灵活的定制能力。SDN 将…

软件项目详细设计说明书实际项目参考(word原件下载及全套软件资料包)

系统详细设计说明书案例&#xff08;直接套用&#xff09; 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件开发全文档下载&#xff08;下面链接或者本文末个人名片直接获取)&#xff1a;软件开发全套资料-…

C++ 常用UI库

AWTK github gitee doc scons 类似RT-Thread element github C Cross platfrom C GUI libraries&#xff0c;QT可替代方案。调试包 SDL GUI cegui 创作不易&#xff0c; 小小的支持一下吧&#xff01;

泛型...

定义&#xff1a;在编译过程中约束操作的数据类型。&#xff08;统一数据类型&#xff09; 格式&#xff1a;<数据类型> 泛型中不能写基本数据类型。 泛型类 在一个类中&#xff0c;某个变量的数据类型不确定时&#xff0c;可以定义带有泛型的类。 泛型的底层是Obje…

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1vlCtC3LGFMzYpSUUDY-tEg 提取码&#xff1a;8110

十四天学会Vue——Vue核心(理论+实战)(第一天)上篇

&#xff01;&#xff01;&#xff01;声明必看&#xff1a;由于本篇开始就写了Vue&#xff0c;内容过多&#xff0c;本篇部分内容还有待完善&#xff0c;小编先去将连续更新的js高阶第四天完成~本篇部分待完善内容明日更新 一、Vue核心&#xff08;上篇&#xff09; 热身top…