【排序算法】详解冒泡排序及其多种优化稳定性分析

文章目录

  • 算法原理
  • 细节分析
  • 优化1
  • 优化2
  • 算法复杂度分析
  • 稳定性分析
  • 总结

算法原理

冒泡排序(Bubble Sort) 就是从序列中的第一个元素开始,依次对相邻的两个元素进行比较,如果前一个元素大于后一个元素则交换它们的位置。如果前一个元素小于或等于后一个元素,则不交换它们;然后每一轮目前的元素中最大的或最小的排到最上面,就像水中的泡泡冒出来一样,故取名为冒泡排序
在这里插入图片描述

说简单点,就是比较两个相邻的元素,将值大或值小的元素交换到右边

动图演示如下
在这里插入图片描述

细节分析

冒泡排序中如果元素有N个,那么完成N-1趟即可. 以升序为例,因为每一趟都会将最大的元素排在最右边,当进行完N-1趟之后,那么剩下的那一个元素一定就是最小的,也一定在最左边,所以在完成N-1趟之后,排序也最终完成.
在这里插入图片描述

代码实现:

void bubble_sort(int* arr, int sz) //数组传的指针,参数中还需传递一个数组大小
{int i = 0;//趟数for (i = 0; i < sz - 1; i++) //总共趟数只有n-1趟{int j = 0;for (j = 0; j < sz - 1 - i; j++) //每轮里面排的数要依次递减{if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

优化1

比如下图两种情况,当代码原本就已经是顺序排好的,或者在中途的时候顺便已经排好,但是你仍将按照上面代码一步一步运行,效率就会大打折扣
所以我们可以设立一个标志位,来提示我们是否排序是否已经排好,不用再进行优化
在这里插入图片描述

所以我们可以在代码中设立一个标志位,来提示我们排序是否已经排好,不用再进行优化

void bubble_sort(int* arr, int sz) //数组传递一定是指针
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){int k = 1;	//k就是一个标志位,在第一趟中如果k变成0了,就说明顺序是需要程序来排序的//如果k不变,还是等于1,则数据顺序本身就是好的,就直接breakfor (int j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;k = 0;}}if (k == 1){break;}}
}

优化2

然而这种优化只能做到某一次排好序的时候我们直接退出排序以达到这个节约时间的要求,所以我们可以继续优化,当一个数组接近有序时(特别是有一小部分已经有序)我们往往只需要在某一个小范围内排序即可,我们可以用一个标记来表示这个范围的下限,例如遇到下面的情况,第一趟时9之后就不会再改变了,所以后面我们就无需比较了
因此,我们可以用个下标index来限制
在这里插入图片描述

void bubble_sort(int* arr, int sz) 
{int i = 0;int index = sz - 1; //这个就是下标位int temporary_index = 0;//趟数for (i = 0; i < sz - 1; i++){int k = 1;	//标志位for (int j = 0; j < index; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;k = 0;temporary_index = j;//注意:由于我这里下标是j和j+1,所以这里的temporary_index = j//如果你下标是j和j-1,那么就要不一样了}}if (k == 1){break;}index = temporary_index;}
}

算法复杂度分析

时间复杂度:

普遍的冒泡排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(n^2).当然,最优的情况,列已经是顺序的,那么只要进行一次循环遍历一下,所以最优时间复杂度是O(n)

空间复杂度

冒泡排序没有额外开空间,所以空间复杂度为O(1)

稳定性分析

对于冒泡排序,拿升序举例,只有在前一个数大于后一个数的时候才会交换,小于或者等于都不会改变位置,所以当一前一后两个相同的数出现时,它们最终的相对顺序也不会改变所以冒泡排序是很稳定的排序

总结

传统的冒泡排序完全可以满足我们最基本的需求,但是也仅仅是最简单的需求,这种简单的两个for循环不加任何的判断语句的形式注定它只能是一种效率较低的算法。虽然能有优化去完善算法,但是总体来说,冒泡排序的效率低.当然冒泡排序也有自身的优点,比如稳定!并且,冒泡排序适合教学,冒泡排序也是许许多多程序员接触的第一个排序算法,所以教学意义重大.

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

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

相关文章

从入门到进阶 之 ElasticSearch 文档、分词器 进阶篇

&#x1f339; 以上分享 ElasticSearch 文档、分词器 进阶篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏&#…

修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库,k8s)

一&#xff1a;安装docker。&#xff08;所有服务器都要安装&#xff09; 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…

27. 移除元素

27. 移除元素 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;__27移除元素__27移除元素__双指针优化 原题链接&#xff1a; 27. 移除元素 https://leetcode.cn/problems/remove-element/description/ 完成情况&#xff1a; 解题思路&a…

Python使用openpyxl读取excel图片

使用openpyxl读取excel中图片&#xff0c;并保存到本地. 需要的包。 from openpyxl import load_workbook from PIL import Image import cv2 import numpy as np具体实现 先把openpyxl读取的图片转换为Image对象&#xff0c;再将Image对象转换为numpy array&#xff0c;num…

DNS压测工具-dnsperf的安装和使用(centos)

系统调优 系统调优脚本&#xff0c;保存为sh文件&#xff0c;chmod提权后执行即可 #!/bin/sh #系统全局允许分配的最大文件句柄数&#xff1a; sysctl -w fs.file-max2097152 sysctl -w fs.nr_open2097152 echo 2097152 > /proc/sys/fs/nr_open #允许当前会话 / 进程打开文…

JAVA基础(JAVA SE)学习笔记(二)变量与运算符

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 第一阶段&#xff1a;Java基本语法 1. Java 语言概述 JAVA基础&#xff08;JAVA SE&#xff09;学习…

抖音同城榜上榜策略

随着抖音的普及&#xff0c;越来越多的人开始使用抖音来展示自己的才华、记录生活或者做推广。但是&#xff0c;如何让自己的短视频在抖音同城榜上榜&#xff0c;成为本地热门话题呢&#xff1f;下面&#xff0c;我将分享一些实用的策略&#xff0c;帮助您实现这一目标。 抖音同…

Unreal Engine 4 + miniconda + Python2.7 + Pycharm

1.​首先启用UE4插件里的Python Scripting插件 ​ 2. 在UE4项目设置中 开启Python开发者模式 生成unreal.py文件&#xff0c;用于在Pychram中引入Unreal PythonAPI 生成的unreal.py 在&#xff1a; "项目路径\Intermediate\PythonStub\unreal.py"3. 安装Miniconda…

stable-diffusion-webui sdxl模型代码分析

采样器这块基本都是用的k-diffusion&#xff0c;模型用的是stability的原生项目generative-models中的sgm&#xff0c;这点和fooocus不同&#xff0c;fooocus底层依赖comfyui中的models&#xff0c;comfy是用load_state_dict的方式解析的&#xff0c;用的load_checkpoint_guess…

java影院管理信息系统设计参考学习

系统设计&#xff1a; 1.1功能结构 为了更好的去理清本系统整体思路&#xff0c;对该系统以结构图的形式表达出来&#xff0c;设计实现该影院系统的功能结构图如下所示&#xff1a; 图1-1 系统总体结构图 1.2数据库设计 1.2.1数据库E/R图 ER图是由实体及其关系构成的图&…

【AI视野·今日Robot 机器人论文速览 第五十五期】Mon, 16 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 16 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;***AcTExplore, 对于未知物体的主动触觉感知。基于强化学习自动探索物体的表面形貌&#xff0c;增量式重建。(from 马里兰…

Node介绍(nvm安装和npm常用命令)

文章目录 Node 介绍为什么要学习 Node.jsNode.js 是什么Node能做什么nvm常用的 nvm 命令npm 快捷键npm 常用命令切换 npm 下包镜像源常用命令 Node 介绍 为什么要学习 Node.js 企业需求 具有服务端开发经验更改front-endback-end全栈开发工程师基本的网站开发能力 服务端前端…

【2023最新版】Python全栈知识点总结

python全栈知识点总结 全栈即指的是全栈工程师&#xff0c;指掌握多种技能&#xff0c;并能利用多种技能独立完成产品的人。就是与这项技能有关的都会&#xff0c;都能够独立的完成。 全栈只是个概念&#xff0c;也分很多种类。真正的全栈工程师涵盖了web开发、DBA 、爬虫 、…

CSS属性:定位属性+案例讲解:博雅互动 前端开发入门笔记(五)

CSS中的定位属性用于指定HTML元素在文档中的位置。常用的定位属性有以下几种&#xff1a; position&#xff1a;用于定义元素的定位方式。 static&#xff08;默认值&#xff09;&#xff1a;元素遵循正常的文档流&#xff0c;不进行特殊的定位。relative&#xff1a;相对定位&…

无声的世界,精神科用药并结合临床的一些分析及笔记(九)

住院计划表 她宫颈癌的手术决定在中心妇产医院进行&#xff0c;由于她抑郁症的爆发&#xff0c;也需要在安定医院调理&#xff0c;我决定制定一个住院计划&#xff0c;征求她和大夫的同意&#xff1a; 节点1&#xff1a;在安定医院治疗抑郁症&#xff0c;调整心理状态&#x…

AMEYA360:君正低功耗AIoT图像识别处理器—X1600/X1600E

• 高性能 XBurst 1 CPU&#xff0c;主频1.0GHz • 超低功耗 • 内置LPDDR2(X1600&#xff1a;32MB&#xff0c;X1600E&#xff1a;64MB) • 实时控制核XBurst 0&#xff0c;面向安全管理和实时控制 • 丰富的外设接口 应用领域 • 基于二维码的智能商业 • 智能物联网 • 高端…

C++ 类和对象(上)------超详细解析,小白必看系列

目录 一、前言 二、面向过程和面向对象初步认识 三、类的引入 三、类的定义 四、类的访问限定符及封装 &#x1f4a6;访问限定符 &#xff08;重点&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; &#x1f4a6;封装 五、类的作用域 六、类的实例化 …

[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发

文章目录 Vue在混合开发中的特点创建MAUI项目创建Vue应用使用element-ui组件库JavaScript和原生代码的交互传递根组件参数从设备调用Javascript代码从Vue页面调用原生代码 读取设备信息项目地址 .NET MAUI结合Vue的混合开发可以使用更加熟悉的Vue的语法代替Blazor语法&#xff…

TCP/IP(十八)TCP 实战抓包分析(二)TCP 三次握手和四次挥手

一 TCP三次握手和四次挥手 说明&#xff1a; 本文三次握手和四次挥手 无异常情况下的分析目标&#xff1a; 通过抓取和分析 HTTP 协议网络包,理解 TCP 三次握手和四次挥手的工作原理 ① 抓包和测试准备 1、 服务端事先执行 tcpdump 抓包 --> 172.25.2.100tcpdump -i b…

【mfc/VS2022】计图实验:绘图工具设计知识笔记2

按钮添加处理程序 1.类视图找到对应类右击&#xff0c;类向导 2. 找到对应的的按钮id 如何将画出的两个相交的圆都显示出来&#xff0c;而不是重叠&#xff08;如下图&#xff09;隐藏了一条圆弧 问题如图&#xff1a; 因为矩形和圆心其实是个背景色的封闭图形&#xff0c;所…