【排序算法】五、冒泡排序(C/C++)

「前言」文章内容是排序算法之冒泡排序的讲解。(所有文章已经分类好,放心食用)

「归属专栏」排序算法

「主页链接」个人主页

「笔者」枫叶先生(fy)

目录

  • 冒泡排序
    • 1.1 原理
    • 1.2 代码实现(C/C++)
    • 1.3 特性总结

冒泡排序

1.1 原理

交换排序

  • 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置
  • 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动
  • 属于交换排序有:冒泡排序和快速排序

冒泡排序

冒泡排序是一种简单的排序算法

冒泡排序:基于数组(顺序表)的结构进行排序

原理:

  • 它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来
  • 重复地进行直到没有再需要交换,也就是说该数列已经排序完成

具体步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

举例

原始数组如下,使用冒泡排序进行排序(升序)
在这里插入图片描述
第一趟:对0-n-1个元素进行遍历,依次对比前后的大小,若是不满足前小后大就交换,此时最大的数就被挪到了最后一个位置(10个元素比较了9次)
在这里插入图片描述

第二趟:对0-n-2个元素进行遍历,依次对比前后的大小,若是不满足前小后大就交换,此时最大的数就被挪到了倒数第二个位置。

由于9已经判断为最大值,所以第二次冒泡排序时就需要找出除9之外的无序表中的最大值,比较过程和第一趟排序完全相同(9个元素比较了8次,除掉9)
在这里插入图片描述
重复上述动作,每一次都将最大的数向后移动,直到遍数组有序

动图演示:

在这里插入图片描述

1.2 代码实现(C/C++)

代码实现如下:(升序)


void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 冒泡排序
void BubbleSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){//每一趟冒泡的过程for (int j = 0; j < n - 1 - i; j++){if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]); // 交换}}}
}

优化

观察发现当数组已经有序了(假设是升序),如[1,2,3,4,5,6,7,8],上面的代码依旧继续进行下一轮的比较,直到所有的数进行比较、排序完,很明显后面的比较没有意义的这就会让这些代码的效率降低

在这种情况下,我们就不必要对有序的数进行排序,以此减少代码执行的次数,提高代码的效率。

因此,可以设置一个exchange ,如果已经排好序了就令 exchange == 0结束循环;如果不是有序的就令exchange == 1继续执行

代码如下:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 冒泡排序
void BubbleSort(int* arr, int n)
{assert(arr);for (int i = 0; i < n - 1; i++){int exchange = 0;// 记录该趟猫爬排序是否进行交换// 每一趟冒泡的过程for (int j = 0; j < n - 1 - i; j++){if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]); // 交换exchange = 1; // 发生数据交换,置exchange为1}}if (exchange == 0) // 该趟冒泡排序没有进行交换,已有序,跳出循环{break;}}
}

1.3 特性总结

冒泡排序特性总结

  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 适用范围:冒泡排序适用于小型的数据集,对于大型数据集效率较低

--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2024.1.20
「 声明 」 余之才疏学浅,故所撰文疏漏难免,或有谬误或不准确之处,敬请读者批评指正。

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

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

相关文章

WorkPlus AI助理私有化部署,助力企业降本增效

在当今数字化时代&#xff0c;提供卓越的客户服务成为了企业成功的重要因素。而AI智能客服技术的兴起&#xff0c;则成为了实现高效、快捷客户服务的利器。作为一款领先的AI助理解决方案&#xff0c;WorkPlus AI助理能够私有化部署&#xff0c;为企业打造私有知识库&#xff0c…

WorkPlus Meet私有化视频会议软件-构建安全高效的内网会议体验

在企业内部&#xff0c;高效的会议协作是推动团队协同和工作效率的关键。而内网会议系统成为了构建安全高效的内部会议体验的必要工具。作为一家领先的内网会议系统&#xff0c;WorkPlus Meet以其卓越的性能和智能化的功能&#xff0c;助力企业实现高效安全的内部会议体验。 为…

爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测

目录 背影 极限学习机 爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测(代码完整,数据)资源-CSDN文库 https://d…

django邮件通知功能-

需求&#xff1a; 1&#xff1a;下单人员下订单时需要向组长和投流手发送邮件通知 2&#xff1a;为何使用邮件通知功能&#xff1f;因为没钱去开通短信通知功能 设计 1&#xff1a;给用户信息表添加2个字段 第一个字段为&#xff1a;是否开通邮件通知的布尔值 第二个字段为: 用…

react15与react16的本质区别

React 15 和 React 16 在架构和一些核心特性上存在本质性的区别。 1.Reconciliation&#xff08;协调&#xff09;算法&#xff1a; React 15: React 15 使用了递归的协调算法&#xff0c;即采用深度优先遍历整个组件树来协调更新。这种方式在处理大型组件树或深度嵌套组件时…

面试官:如何实现三栏布局,中间自适应

今天聊点简单的&#xff0c;最近在整理面试题的时候&#xff0c;看到css部分&#xff0c;感觉自己有段时间没有切页面了&#xff0c;正好趁着这个机会好好复习一下&#xff0c;加深一下印象。 如何实现三栏布局 中间自适应&#xff1f;这也是在前端面试官经常会问到的&#xf…

unity 利用Graphics.Blit来制作图片效果

c# 的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class GraphicsBlitTest : MonoBehaviour {public Texture2D source;//原纹理public Material material;//效果材质public RawImage rawImage;// Sta…

前端实现轮训和长连接

简介 轮训和长连接相关内容可以参考之前的文章消息推送系统。消息推送系统-CSDN博客文章浏览阅读106次。在餐饮行业中&#xff0c;店内应用有pos、厨显屏等&#xff0c;云端应用为对应数据中心。为了实现云端数据和操作指令下发到店内应用&#xff0c;需要有一个系统实现这个功…

【手写数据库toadb】01 开发数据库内核准备阶段-开发环境准备

开发环境 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习…

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

udp丢包处理方法

UDP丢包处理方法如下1&#xff1a; 使用前向纠错码&#xff08;FEC&#xff09;技术。通过在发送端添加冗余信息&#xff0c;使接收端能够在收到部分丢失的数据时进行纠错。 使用前向纠错码&#xff08;FEC&#xff09;技术是一种有效的处理UDP丢包的方法。FEC技术通过在发送…

【ARM 嵌入式 编译系列 2.4 -- GCC 编译参数学习 -Wl,--gc-sections 】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 概述-Wl 选项例子&#xff1a; --gc-sections --gc-sections例子&#xff1a; -Wshadow例子&#xff1a; -Wlogical-op例子&#xff1a; -Waggregate-return例子&#xff1a; -Wfloat-equal例子&#xff1a; -W…

2023年12月 电子学会 青少年软件编程等级考试Scratch三级真题

202312 青少年软件编程等级考试Scratch三级真题 一、单项题 第 1 题 运行左图程序&#xff0c;想得到右图中的效果&#xff0c;红色框应填写的数值是&#xff1f;&#xff08; &#xff09; A&#xff1a;12 B&#xff1a;11 C&#xff1a;10 D&#xff1a;9 第 2 题 下列…

每天都美好的一天

每天我们都会遇到不同的事情&#xff0c;开心的、愤怒的、悲伤的等等&#xff0c;今天过完明天我们还得继续&#xff0c;所以一切又显得不那么重要。一天中如果有不开心的事情发生会影响我们当天很长一段时间&#xff0c;甚至未来几天。 今天所做之事都是自己明天的基础&#…

修改live server的默认浏览器(vscode)

在插件打开设置 修改选定浏览器

VC++中使用OpenCV进行颜色检测

VC中使用OpenCV进行颜色检测 在VC中使用OpenCV进行颜色检测非常简单&#xff0c;首选读取一张彩色图像&#xff0c;并调用函数cvtColor(img, imgHSV, COLOR_BGR2HSV);函数将原图img转换成HSV图像imgHSV&#xff0c;再设置好HSV三个分量的上限和下限值&#xff0c;调用inRange函…

C++实现一个简单的学生管理系统

目录 1.一个简单的学生管理系统简介 2.定义一个 Student 类 2.1用于表示学生信息。 3.定义一个 StudentManager 类 3.1用于管理学生信息。 4.在 main 函数中 4.1使用上述两个类来实现一个简单的学生管理系统 5.C类模板 推荐阅读&#xff1a; calloc与realloc和malloc的…

多线程(看这一篇就够了,超详细,满满的干货)

多线程 一.认识线程&#xff08;Thread&#xff09;1. 1) 线程是什么1. 2) 为啥要有线程1.3) 进程和线程的区别标题1.4) Java的线程和操作系统线程的关系 二.创建线程方法1:继承Thread类方法2:实现Runnable接口方法3:匿名内部类创建Thread子类对象标题方法4:匿名内部类创建Runn…

MySQL TINYINT(1)和TINYINT(2)有什么区别?

文章目录 1.直接建表2.查询数据3.总结 身为程序员&#xff0c;拿事实说话拿代码说话最直观了&#xff0c;show the code 1.直接建表 CREATE TABLE tinyinttest (id int NOT NULL,a TINYINT(1) NOT NULL DEFAULT 0,b TINYINT(2) NOT NULL DEFAULT 0,c TINYINT(1) ZEROFILL NOT…

JSON 基本语法以及在Java 中的使用

文章目录 一、JSON 概述1.1 什么是 JSON1.2 JSON数据类型和语法1.3 JSON 优势 二、使用 JSON2.1 在 Java程序中使用 JSON2.2 Jackson的使用2.2.1 Jackson的简单介绍2.2.2 反序列化2.2.3 序列化 参考资料 一、JSON 概述 1.1 什么是 JSON JSON&#xff08;JavaScript Object No…