【排序算法】五、冒泡排序(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.hqwc.cn/news/417054.html

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

相关文章

Vue3前端开发,父组件给子组件传递数据练习

Vue3前端开发,父组件给子组件传递数据练习&#xff01;还是借用刚刚的组件模板&#xff0c;来开展父传子的练习。 依旧是需要借助官方提供的宏函数来接收数据。defineProps. <script setup> import Child from ./Child.vue import {ref} from vue const getMsg (msg)&g…

高效稳定!使用ETLCloud轻松同步千万数据

一、背景介绍 在现代企业中&#xff0c;数据同步是一项不可或缺的重要任务。然而&#xff0c;面对海量数据的同步需求&#xff0c;传统的方式往往效率低下且容易出错。 在当今大数据时代&#xff0c;常规的数据同步方式包括手动导入导出、自主开发同步脚本等。然而&#xff…

优秘数字人源码:AI虚拟数字人克隆人的强大售后保障

大家好&#xff01;今天我要给大家介绍一款非常实用、功能强大的工具——优秘数字人源码AI虚拟数字人克隆人。这款工具不仅可以帮你节省大量时间和精力&#xff0c;还能提升你的工作效率。更值得一提的是&#xff0c;它的售后保障服务&#xff08;源码&#xff1b;shuziren06&a…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

购物车相关 1.添加购物车1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码开发1.2.1 DTO设计1.2.2 Controller层1.2.3 Service层接口1.2.4 Service层实现类1.2.5 Mapper层 2. 查看购物车2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计 2.2 代码开发2.2.…

Pytest 测试框架与Allure 测试报告——Allure2测试报告-L1

目录&#xff1a; allure2安装 Allure2介绍Allure2报告展示Allure2报告展示-首页概览Allure2报告展示-用例详情页Allure2安装Allure2下载与安装Allure环境验证插件安装-Python插件安装-Java验证插件安装-Javaallure2运行方式 生成测试报告流程使用Allure2运行方式-Python使用A…

手写Vue3源码

Vue3核心源码 B站视频地址&#xff1a;https://www.bilibili.com/video/BV1nW4y147Pd?p2&vd_source36bacfbaa95ea7a433650dab3f7fa0ae Monorepo介绍 Monorepo 是管理项目代码的一种方式&#xff0c;只在一个仓库中管理多个模块/包 一个仓库可以维护多个模块&#xff0c;…

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

ctfshow php特性(web89-web101)

目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 php特性(php基础知识) web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/&…

STM32407用汇顶的GT911触摸芯片调试实盘

这个配置很关键 代码 #include "stm32f4xx.h" #include "GT9147.h" #include "Touch.h" #include "C_Touch_I2C.h" #include "usart.h" #include "delay.h" #include "LCD.h" #incl…

防范水坑攻击:了解原理、类型与措施

水坑攻击是一种常见的网络攻击方式&#xff0c;它利用了人类在互联网上的行为习惯&#xff0c;诱导用户访问恶意网站或下载恶意软件&#xff0c;从而获取用户的个人信息或控制用户的计算机系统。本文将介绍水坑攻击的原理、类型和防范措施。 一、水坑攻击的原理 水坑攻击&…

3D Guassians Splatting相关解读

从已有的点云模型出发&#xff0c;以每个点为中心&#xff0c;建立可学习的高斯表达&#xff0c;用Splatting即抛雪球的方法进行渲染&#xff0c;实现高分辨率的实时渲染。 1、主要思想 1.引入了一种各向异性&#xff08;anisotropic&#xff09;的3D高斯分布作为高质量、非结…

绑定class,条件渲染,列表过滤,列表排序

目录​​​​​​​ 绑定class 条件渲染 列表过滤 列表排序 绑定class <div class"normal" :class"mood" click"changename">111{{name}}</div><div class"normal" :class"arr">111{{name}}</div…