数据结构算法-冒泡排序算法

引言

虽然选择排序好用 ,但有点问题 也就是频繁找最大值下标 放到 未排序的后面
因为每次需要扫描整个未排序序列,找到最大值或最小值的下标,并将其交换到未排序序列的最后一个位置。这样做的问题在于,在后面的迭代中,我们仍然需要扫描整个未排序序列,包括已经排序好的部分,这是浪费时间的。

另外,选择排序是不稳定的排序算法,因为在找到最大值或最小值的下标时,并没有考虑值相同的元素的顺序。如果有多个相同值的元素,交换它们的位置可能会打乱它们的相对顺序

也就是说 相同的元素也交换 可能位置有变化
对于相同的元素,它们在排序后的位置可能会改变,因为冒泡排序会将相邻的两个元素进行比较和交换,这样相同的元素就可能会在排序过程中交换位置。对于选择排序而言,它在找到最大值或最小值的下标时,并没有考虑值相同的元素的顺序,因此如果有多个相同值的元素,交换它们的位置可能会打乱它们的相对顺序。因此选择排序也是不稳定的排序算法。

冒泡排序算法思想

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
到i=2的时候 已经是排序了 那么这里应该如何优化?
如果有一种机制 一开始默认已排序 在内层循环判断第一个比第二大发生交换的时候 制定为false
内层循环结束判断这个排序标志 为真排序完成直接退出外层循环

冒泡排序的基本思想是,通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底的气泡一样逐渐向上冒。
在这个过程中,每次内循环都会将当前未排序部分的最大元素“冒泡”到其最终位置。因此,每次外循环之后,未排序部分的元素数目会减少一个。

冒泡排序算法专区

// 定义一个名为bubbleSort的函数,它接收两个参数:一个名为arr的整数数组和一个名为size的整数,表示数组的大小  
void bubbleSort(int arr[], int size) {  // 外层循环,用于控制排序的轮数。因为每一轮都会将最大的元素移动到数组的末尾,所以最多需要size-1轮。  for (int i = 0; i < size - 1; i++) {    // 内层循环,用于在每一轮中逐一比较相邻的元素。由于每一轮都会确保最大的元素移动到其应在的位置,因此内层循环只需要遍历到“size-1-i”即可。  for (int j = 0; j < size - 1 - i; j++) {    // 如果当前元素大于下一个元素,则交换它们的位置。这是冒泡排序的核心操作。  if (arr[j] > arr[j+1]) {    // 调用swap函数交换两个元素的值。swap(arr[j], arr[j+1]);    }    }    }    
}
}

优化:

// 定义一个名为bubbleSort的函数,接收一个整数数组arr和数组的大小size作为参数  
void bubbleSort(int arr[], int size) {  // 外层循环,遍历整个数组  for (int i = 0; i < size - 1; i++) {    // 定义一个布尔变量swapped,用于记录是否发生了交换  bool swapped = false; // 用于记录是否发生了交换    // 内层循环,比较相邻的元素并进行交换  for (int j = 0; j < size - 1 - i; j++) {    // 如果当前元素大于下一个元素,则进行交换  if (arr[j] > arr[j+1]) {    // 调用swap函数交换两个元素的值  swap(arr[j], arr[j+1]);    // 将swapped设为true,表示发生了交换    swapped = true; // 发生了交换,将swapped设为true    }    }    // 如果内层循环结束时,swapped仍然为false,说明数组已经是有序的,直接退出外层循环  if (!swapped) break; // 如果内层循环结束时,swapped仍然为false,说明数组已经是有序的,直接退出外层循环    }    
}

升/降 序通用

// 定义一个函数 BubbleSort,接受一个整数数组 arr,数组的大小 size,和一个比较函数 cmp 作为参数。这个函数用来对数组进行冒泡排序。  
void  BubbleSort(int arr[], int size, bool(*cmp)(const int&, const int&)) {  // 检查传入的比较函数是否为空。如果为空,则直接返回,不进行任何操作。  if (cmp == nullptr) {  return;  }  // 开始进行外层循环,从数组的第一个元素到倒数第二个元素(i 从 0 到 size-2)  for (int  i = 0; i < size-1; i++){  // 定义一个布尔变量 IsSort,初始值为 true。这个变量用来检查数组是否已经有序。  bool IsSort = true;  // 进行内层循环,从数组的第二个元素开始到倒数第三个元素(j 从 0 到 size-1-i)  for (int j= 0; j < size-1-i; j++){  // 使用比较函数 cmp 来判断 arr[j] 是否大于 arr[j + 1]。如果大于,则交换这两个元素的位置,并将 IsSort 设为 false。  if (cmp(arr[j], arr[j + 1])) {  swap(arr[j], arr[j + 1]);  IsSort = false;  }  }  // 如果 IsSort 仍然为 true,说明这个位置的元素已经是有序的,可以结束内层循环。  if (IsSort)	{  break;  }  }  
}  // 定义一个函数 GreaterCmp,接受两个整数作为参数,如果第一个整数大于第二个整数,返回 true,否则返回 false。这个函数用于比较两个整数的大小。  
bool GreaterCmp(const int& val1, const int &val2) {  return val1 > val2;  
}  // 定义一个函数 LessCmp,接受两个整数作为参数,如果第一个整数小于第二个整数,返回 true,否则返回 false。这个函数用于比较两个整数的大小。  
bool LessCmp(const int& val1, const int& val2) {  return val1 < val2;  
}

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

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

相关文章

C# WPF上位机开发(计算器界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf最大的优势就是开发业务软件比较快、效率比较高。一般来说&#xff0c;它的界面和逻辑部分可以同时开发。界面的部分用xaml编写即可&#xf…

Spring Framework详解

学习目标 能够说出Spring的体系结构 能够编写IOC入门案例 能够编写DI入门案例 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spri…

Nat. Mach. Intell. | 预测人工智能的未来:在指数级增长的知识网络中使用基于机器学习的链接预测

今天为大家介绍的是来自Mario Krenn团队的一篇论文。一个能够通过从科学文献中获取洞见来建议新的个性化研究方向和想法的工具&#xff0c;可以加速科学的进步。一个可能受益于这种工具的领域是人工智能&#xff08;AI&#xff09;研究&#xff0c;近年来科学出版物的数量呈指数…

如何选择适合的光电传感器与 STM32 微控制器进行接口设计

本文介绍了如何选择适合的光电传感器与 STM32 微控制器进行接口设计的方法。首先我们将介绍一些选择光电传感器的关键因素&#xff0c;包括测量范围、响应时间、分辨率和输出类型。然后我们将介绍如何根据所选传感器的特性进行硬件连接和接口设计。最后&#xff0c;我们将提供示…

同旺科技 USB TO SPI / I2C --- 调试W5500

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 读取重试时间值寄存器&#xff0c;默认值0x07D0 输出结果与默认值一致&#xff0c;芯片基本功能已经调通&am…

go自定义端口监听停用-------解决端口被占用的问题

代码 package mainimport ("fmt""log""net""os/exec""strconv""strings" )func getSelect(beign int, end int) int {var num intfor {_, err : fmt.Scan(&num)if err ! nil {fmt.Println("输入错误&am…

2、RocketMQ源码分析(二)

RocketMQ的底层通信模块remoting remoting是RocketMQ的底层通信模块&#xff0c;RocketMQ底层通讯是使用Netty来实现的。本文通过对remoting源码进行分析&#xff0c;来说明remoting如何实现高性能通信的。 二、Remoting 通信模块结构 remoting 的网络通信是基于 Netty 实现&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《市场环境下运行的光热电站子系统容量优化配比研究》

这个标题涉及到对市场环境下运行的光热电站子系统进行容量优化配比的研究。让我们逐步解读&#xff1a; 市场环境下运行的光热电站&#xff1a; 这指的是光热电站在实际市场环境中的运行&#xff0c;可能包括了市场相关的经济、政策、竞争等因素。 子系统&#xff1a; 光热电站…

十六进制数列求和

高精度数组的集大成 做的时候在和高中同学叙叙旧&#xff0c;差点寄掉 代码如下&#xff1a; #include<stdio.h> void expand(int len); const char hexadecimal[17] "0123456789ABCDEF"; int result[20], mid[20], l_result[100];int main(void) {char tm…

你好!二分查找【JAVA】

1.初次相识 二分查找又称折半查找&#xff0c;是一种在有序数组中查找特定元素的算法。二分查找的基本思想是&#xff1a;通过不断地二分数组的中间元素&#xff0c;缩小查找区间&#xff0c;直到找到目标元素或者确定目标元素不存在为止。 二分查找的时间复杂度为O(logn)&…

docker配置redis主从、哨兵集群

搭建redis主从 准备工作 在/usr/local/software/redis/文件夹下建立如下的文件夹、文件 rootlocalhost redis]# mkdir -p 6379/conf 6379/data 6379/log [rootlocalhost redis]# mkdir -p 6380/conf 6380/data 6380/log [rootlocalhost redis]# mkdir -p 6381/conf 6381/…

如何创建一个vue工程

1.打开vue安装网址&#xff1a;安装 | Vue CLI (vuejs.org) 2.创建一个项目文件夹 3.复制地址 4.打开cmd&#xff0c;进入这个地址 5.复制粘贴vue网页的安装命令 npm install -g vue/cli 6.创建vue工程 vue create vue这里可以通过上下键来进行选择。选最后一个选项按回车。 …

制作一个RISC-V的操作系统-环境搭建

文章目录 前言环境搭配 前言 由于之前的操作系统反馈难度太大&#xff0c;所以准备从这个RISC-V操作系统出发&#xff0c;以后知识层面更加深入再去完善。 环境搭配 按照依赖项 $ sudo apt update $ sudo apt install build-essential gcc make perl dkms git gcc-riscv64-…

三轴加速度计LIS2DW12开发(2)----基于中断信号获取加速度数据

三轴加速度计LIS2DW12开发.2--轮基于中断信号获取加速度数据 概述视频教学样品申请生成STM32CUBEMX串口配置IIC配置CS和SA0设置INT1设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置开启INT1中断设置传感器的量程配置过滤器链配置电源模式设置输出数据速率中断判断加速…

Mac卸载、安装Python

卸载 说明 对于删除 Python&#xff0c;我们首先要知道其具体都安装了什么&#xff0c;实际上&#xff0c;在安装 Python 时&#xff0c;其自动生成&#xff1a; Python framework&#xff0c;即 Python 框架&#xff1b;Python 应用目录&#xff1b;指向 Python 的连接。 …

mazing是什么软件?为什么选择iMazing

说起iOS设备管理工具&#xff0c;可能大家还有点陌生&#xff0c;其实就是Apple公司开发的移动设备&#xff0c;因其的操作系统是独特的iOS系统&#xff0c;所以又叫iOS设备。比如大家都在用的iPhone手机&#xff0c;就是这样类型的一个设备。 mazing是什么软件? iMazing是一…

【Linux】Ubuntu添加root用户

在Ubuntu中&#xff0c;默认情况下是禁用了root用户的登录。如果仍然想要启用root用户&#xff0c;并设置root用户的密码&#xff0c;应按照以下步骤进行操作&#xff1a; 一、输入sudo passwd root设置root用户密码 二、切换root用户 sudo -i su root 这两条命令均可却换至…

前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库

文章目录 AjaxAjax特点 Promise 异步编程&#xff08;缺&#xff09;Promise基本使用状态 - PromiseState结果 - PromiseResult AxiosVue中使用AxiosAxios请求方式getpostput和patchdelete并发请求 Vue路由 - vue-router单页面Web应用&#xff08;single page web application&…

Android HCI日志分析案例2

案例1--蓝牙音箱电量用完后&#xff0c;配对一直失败&#xff0c;提示PIN码不正确 基于MTK平台&#xff0c;通过MTKLogger开启保存HCI日志 问题定位分析 Android日志查看logcat 搜索到关键log 01-20 10:07:55.403760 978 1075 V bt_stack: [VERBOSE2:btm_inq.cc(2032)] …

Stream

什么是Stream&#xff1f; 也叫Stream流&#xff0c;是jdk8开始新增的一套API&#xff0c;可以用来操作集合或者数组的数据 优势&#xff1a;Stream流大量的结合了Lambda的语法风格来编程&#xff0c;提供了一种更加强大&#xff0c;更加简单的方式操作集合或数组中的数据&am…