手撕排序算法:冒泡排序

文章目录

  • 1.算法思想
  • 2.冒泡排序具体过程
  • 3.算法分析
    • 3.1时间复杂度
    • 3.2空间复杂度
  • 4.算法的优缺点
    • 4.1算法的优点
    • 4.2算法的缺点
  • 5.冒泡排序优化方案
  • 6.算法实现
  • 7.实战
    • 7.1 力扣88. 合并两个有序数组
    • 7.2力扣2148.元素计数
    • 7.3力扣1046.最后一块石头的重量

冒泡排序(Bubble Sort)是一种简单的排序算法,通过多次比较和交换相邻的元素,将数组
中的元素按升序或降序排列。

1.算法思想

冒泡排序的基本思想是:每次遍历数组,比较相邻的两个元素,如果它们的顺序错误,就将它
们交换,直到数组中的所有元素都被遍历过。
具体的算法步骤如下:
第一步、遍历数组的第一个元素到最后一个元素。
第二步、对每一个元素,与其后一个元素进行比较。
第三步、如果顺序错误,就将它们交换。
重复上述步骤,直到数组中的所有元素都被遍历过至少一次。

2.冒泡排序具体过程

首先需要将「第一个元素」和「第二个元素」进行「比较」,如果前者大于后者,则进行「交
换」,
然后再比较「第二个元素」和「第三个元素」,以此类推,直到「最大的那个元素」被移动
到「最后的位置」。
然后,进行第二轮「比较」,直到「次大的那个元素」被移动到「倒数第二的位置」
最后,经过一定轮次的「比较」和「交换」之后,一定可以保证所有元素都是「升序」排列
的。

3.算法分析

3.1时间复杂度

我们假设「比较」和「交换」的时间复杂度为O(1)(为什么这里说假设,因为有可能要「比
较」的两个元素本身是数组,并且是不定长的,所以只有当系统内置类型,我们才能说这两个操
是0(1)的)。
「冒泡排序」中有两个嵌套循环。
外循环正好运行一1次迭代。但内部循环运行变得越来越短:
当i=0,内层循环n一1次「比较」操作。
英雄哪里出来182585442552122
当i=1,内层循环n一2次「比较」操作。
当i=2,内层循环n一3次「比较」操作。
当i=n一2,内层循环1次「比较」操作。
当i=n一1,内层循环0次「比较」操作。
英雄哪里出来海豚知通552122
因此,总「比较」次数如下:
总的时间复杂度为:O(n^2)

3.2空间复杂度

由于算法在执行过程中,只有「交换」变量时候采用了临时变量的方式,而其它没有采用任何
的额外空间,所以空间复杂度为O(1)。

4.算法的优缺点

4.1算法的优点

1.简单易懂:冒泡排序的算法思想非常简单,容易理解和实现。
2.稳定排序:冒泡排序是一种稳定的排序算法,即在排序过程中不会改变相同元素的相对顺
序。

4.2算法的缺点

1.效率较低:由于需要进行多次比较和交换,冒泡排序在处理大规模数据时效率较低。
2.排序速度慢:对于大型数组,冒泡排序的时间复杂度较高,导致排序速度较慢。

5.冒泡排序优化方案

「冒泡排序」在众多排序算法中效率较低,时间复杂度为O(2)。
想象一下,当有=100000个数字。即使我们的计算机速度超快,并且可以在1秒内计算
10^8次操作,但冒泡排序仍需要大约一百秒才能完成。
但是,它的外层循环是可以提前终止的,例如,假设一开始所有数字都是升序的,那么在首轮「比较」的时候没有发生任何的「交换」,那么后面也就不需要继续进行「比较」了,直接跳出外
层循环,算法提前终止。
「改进思路」如果我们通过内部循环完全不交换,这意味着数组已经排好序,我们可以在这个
点上停止算法。

6.算法实现

void Bottle_Sort(int nums[],int numsSize) {  for (int i = 0; i <numsSize - 1; i++) {  for (int j = 0; j < numsSize - i - 1; j++) {  if (nums[j] > nums[j+1]) {  int temp = nums[j];  nums[j] = nums[j + 1];  nums[j + 1] = temp;  }  }  }  
}

7.实战

7.1 力扣88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {  int i,j,num;  for(i=0;i<n;i++)  {  nums1[m+i]=nums2[i];  }  for(i=0;i<nums1Size-1;i++)  {  for(j=0;j<nums1Size-1-i;j++)  {  if(nums1[j]>nums1[j+1])  {  num=nums1[j];  nums1[j]=nums1[j+1];  nums1[j+1]=num;  }  }  }  
}

7.2力扣2148.元素计数

给你一个整数数组 nums ,统计并返回在 nums 中同时至少具有一个严格较小元素和一个严格较大元素的元素数目。

void Bottle_Sort(int nums[],int numsSize) {  for (int i = 0; i <numsSize - 1; i++) {  for (int j = 0; j < numsSize - i - 1; j++) {  if (nums[j] > nums[j+1]) {  int temp = nums[j];  nums[j] = nums[j + 1];  nums[j + 1] = temp;  }  }  }  
}  
int countElements(int* nums, int numsSize) {  Bottle_Sort(nums,numsSize);  int count = 0;  for(int i = 1; i < numsSize - 1; i++){  if(nums[i] != nums[0] && nums[i] != nums[numsSize - 1]){  count++;  }  }  return count;  
}

7.3力扣1046.最后一块石头的重量

有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x<=y。那么粉碎的可
能结果如下:

  • 如果x=y,那么两块石头都会被完全粉碎;
  • 如果x!=y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。
    最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回0。
void Bottle_Sort(int nums[],int numsSize) {  for (int i = 0; i <numsSize - 1; i++) {  for (int j = 0; j < numsSize - i - 1; j++) {  if (nums[j] > nums[j+1]) {  int temp = nums[j];  nums[j] = nums[j + 1];  nums[j + 1] = temp;  }  }  }  
}  
int lastStoneWeight(int* stones, int stonesSize) {  while(stonesSize > 1){  Bottle_Sort(stones,stonesSize);  int v = stones[stonesSize - 1] - stones[stonesSize - 2];  stonesSize -=2;  if(v != 0 || stonesSize == 0){  stones[stonesSize] = v;  stonesSize++;  }  }  return stones[0];  
}

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

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

相关文章

线程池-拒绝策略

线程池-拒绝策略 RejectedExecutionHandlerAbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy自定义拒绝策略 当核心线程已用尽 & 阻塞队列已满 & 超过最大线程数时&#xff0c;再向线程池提交任务&#xff0c;则会触发线程池的拒绝策略。 RejectedExecuti…

Python爬虫与文本到语音转换实战:获取并播报长沙天气

简介&#x1f495; 在本文中&#xff0c;我们将通过一个简单的Python脚本&#xff0c;演示如何使用网络爬虫技术获取长沙的天气信息&#xff0c;并使用文本到语音技术将天气信息播报出来。我们将使用pyttsx3库进行语音播报&#xff0c;使用requests库来发起网络请求&#xff0…

自动驾驶-2D目标检测

yolo及yolo的变体 anchor boxes (锚框) intersection over union 并集交集 用于计算两个边界框的差异程度 bounding box predictions 边界框预测 non maximum suppression非极大值抑制 为了分离这些边界框并为每个对象获得单个边界框&#xff0c;我们使用IOU。这种获取单…

2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

文章目录 1 说明2 集合相关特性2.1 DictionaryDrawerSettings2.2 ListDrawerSettings2.3 TableColumnWidth2.4 TableList2.5 TableMatrix 1 说明 ​ 本章介绍 Odin Inspector 插件中集合&#xff08;Dictionary、List&#xff09;相关特性的使用方法。 2 集合相关特性 2.1 D…

2-34 小波神经网络采用传统 BP 算法

小波神经网络采用传统 BP 算法&#xff0c;存在收敛速度慢和易陷入局部极小值两个突出弱点。建立了基于遗传算法的小波神经网络股票预测模型 GA-WNN。该模型结合了遗传算法的全局优化搜索能力以及小波神经网络良好的时频局部特性。运用 MATLAB 对拟合和预测过程进行仿真。结果表…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2139张 标注数量(xml文件个数)&#xff1a;2139 标注数量(txt文件个数)&#xff1a;2139 标注类别数&#xff1a;8 标注类别名称&#xff1a;[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

李笑来思考框架的结晶《思考的真相》(2024 年新书)

点开文章的你肯定读过李笑来的书&#xff0c;比如讲认知的《财富自由之路》、讲管理自己的《把时间当做朋友》、讲财富底层逻辑的《财富的真相》、讲定投的《让时间陪你慢慢变富》等等。 李笑来的书不讲究华丽的文字&#xff0c;在意逻辑、论证的严谨&#xff0c;层层递进&…

数据结构之通过“ 队列 ”实现的“ 栈 ”功能。

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 本节内容是利用“ 队列 ”先进先出的特点 实现 “ 栈 ” 先进后出。 一、题目 1.1 题目描述&#xff1a; 请你仅使用两个队列实现一个后入先出&…

成为CMake砖家(1): 在Windows上查看CMake文档

大家好&#xff0c;我是白鱼。 在使用 CMake 的过程中&#xff0c;想必有不少朋友像我一样&#xff0c; 想在本地查看 CMake 文档。 首先安装 CMake, Installer 版本&#xff1a; 安装后&#xff0c;从开始菜单输入 CMake&#xff0c; 选择结果中的 “CMake Documentation”…

如何在 Shell 脚本中使用函数 ?

函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中&#xff0c;并从不同的地方调用该函数&#xff0c;库是函数的集合。我们可以在库中定义常用的函数&#xff0c;其他脚本可以使用它们而无需复制代码。 Calling function 在 Shell 中&#xff0c;调用函数和调用…

1.33、激活可视化卷积神经网络(matalb)

1、激活可视化卷积神经网络原理及流程 激活可视化&#xff08;Activation Visualization&#xff09;指的是通过可视化神经网络中激活函数的输出&#xff0c;来理解神经网络是如何学习并提取特征的过程。在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;我们可以通过…

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强&#xff0c;大项目不适应tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;pytnon rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用的&#xff09;动静分离 默认配置不适合生产环境&…

MySQl高级篇 -索引优化篇

索引 InnoDB采用了一个B数来存储索引&#xff0c;使得在千万级数据量的一个情况下&#xff0c;树的高度可以控制在3层以内&#xff0c;而层高代表磁盘IO的一个次数&#xff0c;因此基于索引查找可以减少磁盘IO的次数 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引…

头歌资源库(31)象棋中马遍历棋盘的问题

一、 问题描述 二、算法思想 这是一个典型的深度优先搜索问题。 首先&#xff0c;我们创建一个mn的棋盘&#xff0c;并初始化所有的点为未访问状态。 然后&#xff0c;我们从(0, 0)位置开始进行深度优先搜索。 在每一步中&#xff0c;我们先标记当前位置为已访问&#xff0…

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只&#xff0c;内容变化已多单一的fragment&#xff0c;变成连续的&#xff0c;特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动&#xff0c;到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

基于Python+Django+MySQL+Echarts的租房数据可视化分析系统

租房数据可视化 DjangoMySQLEcharts 基于PythonDjangoMySQLEcharts的租房数据可视化分析系统 Echarts 信息存储在数据库中 不含爬虫代码&#xff0c;或爬虫代码已失效 不支持登录注册 简介 基于DjangoMySQLEcharts的租房数据可视化系统通过连接数据库获取数据&#xff0c…

【格密码基础】旋转格的性质

目录 一. 回顾ZSVP问题 二. 基于ZSVP问题的密码系统 三. 格基旋转与Gram矩阵 四. 补充矩阵QR分解 4.1 矩阵分解 4.2 举例 前序文章请参考&#xff1a; 【格密码基础】详解ZSVP问题-CSDN博客 一. 回顾ZSVP问题 根据之前的讨论我们知道解决ZSVP问题的计算复杂度为&#x…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA&#xff1f; 《网络弹性法案》&#xff08;CRA&#xff09;是即将出台的欧盟法规&#xff0c;旨在确保在欧盟销售的所有数字产品和服务&#xff08;如连接到互联网的软件和硬件&#xff09;都采用强大的网络安全措施。 该法案要求…