C++中常用的排序方法之——冒泡排序

 成长路上不孤单😊😊😊😊😊😊

【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】

今日分享关于C++中常用的排序方法之——冒泡排序的相关内容!

关于【C++中常用的排序方法之——冒泡排序】

目录:

  • 一、 冒泡排序的定义
  • 二、冒泡排序的算法原理
  • 三、冒泡排序的算法示例
  • 四、冒泡排序的算法分析
  • 五、冒泡排序的特点
  • 六、冒泡排序的优点
  • 七、冒泡排序的缺点

冒泡排序(Bubble Sort)

一、冒泡排序的定义

冒泡排序的英文Bubble Sort,是一种最基础的交换排序。
大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。而我们的冒泡排序之所以叫做冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。

  

二、冒泡排序的算法原理

假定序列中有n个数,要进行从小到大的排序。若参与排序的数组元素共有n个,则需要n-1轮排序。在第í轮排序中,从左端开始,相邻两数比较大小,若反序则将两者交换位置,直到比较第n+1-i个数为止。第1个数与第2个数比较,第2个数和第3个数比较,一直到第n-i个数与第n+1-i个数比较,一共处理 n-i次。此时,第n+1-i个位置上的数已经有序,后续就不需要参加以后的排序。 

(1)第1轮冒泡排序先从第1个数和第2个数开始比较,若第1个数大于第2个数,则需要交换两者的位置;否则保持不变。重复这一过程,直到处理完本轮数列中最后两个数。 

(2)第2轮冒泡排序与第1轮冒泡排序进行相同的排序,使大的数交换到n-2的位置上。 

(3)重复以上过程,共需经过n-1轮冒泡排序后,数据实现升序排序。

三、冒泡排序的算法示例

对于序列[26,28,24,11],采用非递减规则进行排序,排序过程如下所示。 

  

(1) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 

(2) 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 

(3) 针对所有的元素重复以上的步骤,除了最后一个。 

(4) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

四、冒泡排序的算法分析

1、时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数

  

    

若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i 次,关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

  

  

2、算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

五、冒泡排序的特点

时间复杂度‌:冒泡排序的时间复杂度为O(n^2)。在最坏的情况下(即初始序列完全逆序),需要进行n(n-1)/2次比较和3n(n-1)/2次移动,时间复杂度为O(n^2)。在最好的情况下(即初始序列已经有序),时间复杂度为O(n),但这种情况较为罕见。

空间复杂度‌:冒泡排序是一种就地排序算法,不需要额外的存储空间,因此空间复杂度为O(1)。

稳定性‌:冒泡排序是一种稳定的排序算法,即相同元素的相对位置不会改变。

适用场景‌:由于冒泡排序的时间复杂度较高,它适用于数据量较小的情况。对于大量数据的排序,效率较低。

算法原理‌:冒泡排序通过重复遍历待排序的数列,比较两个相邻的元素,如果它们的顺序错误就交换过来。遍历工作是重复进行的,直到没有再需要交换的元素为止。

优化方法‌:可以通过设置一个标志位来优化冒泡排序。如果在一次完整的遍历中没有发生交换,说明数组已经有序,可以直接结束排序过程。这种方法可以在某些情况下将时间复杂度降低到O(n)。

六、冒泡排序优点

1‌、实现简单‌:冒泡排序的算法逻辑非常简单,容易理解和实现。它只需要通过重复遍历要排序的数列,比较相邻元素的值,并在必要时交换它们的位置。

‌2、代码简洁‌:冒泡排序的代码非常简洁,不需要复杂的操作和额外的存储空间。

3‌、原地排序‌:冒泡排序是一种原地排序算法,不需要额外的内存空间来存储排序结果。它直接在原始数组上进行元素的比较和交换操作。

4‌、稳定性‌:冒泡排序是一种稳定的排序算法,即相等元素的相对顺序在排序前后保持不变。只有当两个相邻元素进行交换时才会改变它们的相对顺序。

5‌、适用于小规模数据‌:在数据规模较小的情况下,冒泡排序的性能还是可以接受的。对于小规模的数据集,冒泡排序可能比其他复杂的排序算法更快。

七、冒泡排序的缺点

1、时间复杂度高‌:冒泡排序的时间复杂度为O(n^2),在数据量较大时效率较低,尤其是当数据完全逆序时,时间复杂度达到O(n^2)。

2‌、不适合大规模数据‌:由于其较高的时间复杂度,冒泡排序不适合处理大规模数据集。

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

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

相关文章

ARM嵌入式学习--第十天(UART)

--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器,是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控…

解锁微服务:五大进阶业务场景深度剖析

目录 医疗行业:智能诊疗的加速引擎 电商领域:数据依赖的破局之道 金融行业:运维可观测性的提升之路 物流行业:智慧物流的创新架构 综合业务:服务依赖的优化策略 医疗行业:智能诊疗的加速引擎 在医疗行业迈…

基于Flask的旅游系统的设计与实现

【Flask】基于Flask的旅游系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为后端开发语言,结合前端Bootstrap框架,为用户提供了丰富…

《HelloGitHub》第 106 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…

一文讲解Java中的BIO、NIO、AIO之间的区别

BIO、NIO、AIO是Java中常见的三种IO模型 BIO:采用阻塞式I/O模型,线程在执行I/O操作时被阻塞,无法处理其他任务,适用于连接数比较少的场景;NIO:采用非阻塞 I/O 模型,线程在等待 I/O 时可执行其…

Linux——网络(tcp)

文章目录 目录 文章目录 前言 一、TCP逻辑 1. 面向连接 三次握手(建立连接) 四次挥手(关闭连接) 2. 可靠性 3. 流量控制 4. 拥塞控制 5. 基于字节流 6. 全双工通信 7. 状态机 8. TCP头部结构 9. TCP的应用场景 二、编写tcp代码函数…

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …

MySQL备忘录

MySQL 的一些基础知识记录,包括一些配置文件,cmd命令等 前言 这里使用的MySQL版本是8.0.25 MySQL安装,包括相关配置文件文本内容,相关cmd命令 通过安装包配置环境变量使用cmd管理员权限通过命令安装MySQL 8.0.25 一、安装配置 …

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好,我是老六哥,我正在共享使用AI提高工作效率的技巧。欢迎关注我,共同提高使用AI的技能,让AI成功你的个人助理。 许多人可能会跟老六哥一样,有过这样的体验:当我们遇到一个能力出众或对事物有独到见解的…

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例,实现一个可以修改当前用户信息功能。 当用户点击某个信息时,跳转到信息详情页,然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…

Linux文件原生操作

Linux 中一切皆文件,那么 Linux 文件是什么? 在 Linux 中的文件 可以是:传统意义上的有序数据集合,即:文件系统中的物理文件 也可以是:设备,管道,内存。。。(Linux 管理的一切对象…

HttpClient学习

目录 一、概述 二、HttpClient依赖介绍 1.导入HttpClient4依赖 2.或者导入HttpClient5依赖 3.二者区别 三、HttpClient发送Get请求和Post请求测试 (一)通过HttpClient发送Get请求 (二)通过HttpClient发送Post请求 一、概述 HttpClient是 Apache 软件基金会提供的一…

【重生之我在学习C语言指针详解】

目录 ​编辑 --------------------------------------begin---------------------------------------- 引言 一、指针基础 1.1 内存地址 1.2 指针变量 1.3 指针声明 1.4 取地址运算符 & 1.5 解引用运算符 *** 二、指针运算 2.1 指针加减运算 2.2 指针关系运算 三…

< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)

目标: 使用 日本阿里云的 VPM 传输文件。 暂时方案: 使用 主机JPN 下载 https://huggingface.co/ 上模型从 JPN 放到 度狗上在家里从狗度下载 为了减少编程,尽量使用现在软件 ,就找到 GitHub - qjfoidnh/BaiduPCS-Go: iikira…

98.1 AI量化开发:长文本AI金融智能体(Qwen-Long)对金融研报大批量处理与智能分析的实战应用

目录 0. 承前1. 简介1.1 通义千问(Qwen-Long)的长文本处理能力 2. 基础功能实现2.1 文件上传2.2 单文件分析2.3 多文件分析 3. 汇总代码&运行3.1 封装的工具函数3.2 主要功能特点3.3 使用示例3.4 首次运行3.5 运行结果展示 4. 注意事项4.1 文件要求4.2 错误处理机制4.3 最佳…

Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)

目录 什么是软件包 Linux 软件包管理器 apt 认识apt 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式下各指令汇总 vim底行模式个指令汇总 Linux编译器 - gcc/g gcc/g的作…

deepseek R1的确不错,特别是深度思考模式

deepseek R1的确不错,特别是深度思考模式,每次都能自我反省改进。比如我让 它写文案: 【赛博朋克版程序员新春密码——2025我们来破局】 亲爱的代码骑士们: 当CtrlS的肌肉记忆遇上抢票插件,当Spring Boot的…

SpringBoot源码解析(八):Bean工厂接口体系

SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…

基于Django的个人博客系统的设计与实现

【Django】基于Django的个人博客系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统采用Python作为主要开发语言,结合Django框架构建后端逻辑,并运用J…

Vue-day2

7.Vue的生命周期 mounted函数:在页面加载完毕时,发送异步请求,加载数据,渲染页面 createApp({date(){},methods:{},mounted:function(){console.log(Vue挂载完毕,发送请求获取数据)} }).mount(#{app}) 8.ajax函数库…