十大排序之冒泡排序与快速排序(详解)
文章目录
- 🐒个人主页
- 🏅算法思维框架
- 📖前言:
- 🎀冒泡排序 时间复杂度O(n^2)
- 🎇1. 算法步骤思想
- 🎇2.动画实现
- 🎇 3.代码实现
- 🎇4.代码优化(添加标志量)
- 🎀快速排序 时间复杂度O(n*logn)
- 🎇1. 算法步骤思想
- 🎇2、动画演示
- 🎇3.代码实现
🐒个人主页
🏅算法思维框架
📖前言:
本篇博客主要以介绍十大排序算法中的冒泡排序、快速排序,有详细的图解、动画演示、良好的代码注释,帮助加深对这些算法的理解,进行查漏补缺~
🎀冒泡排序 时间复杂度O(n^2)
冒泡排序(Bubble Sort) 是一种简单直观的排序算法。它重复地走访要排序的数列,一次
比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直
到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元
素会经交换慢慢"浮"到数列的头部。
🎇1. 算法步骤思想
<1>比较相邻的元素。如果第一个比第二个大,就交换他们两个。
<2>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元 素会是最大的数。
<3>重复<1><2>步骤,除了最后一个元素。 对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
🎇2.动画实现

🎇 3.代码实现
public void sort(int[] arr){if(arr==null||arr.length<2){return;}//思路:【冒泡排序】借助双循环,进行两两交换,将最大的“气泡”排到数组末尾for (int i = 0; i <arr.length-1; i++) {//排n-1趟for (int j = 1; j <arr.length-i; j++) {//比较n-1-i次,因为下标是从1开始取的if(arr[j-1]>arr[j]){//两两交换int temp=arr[j-1];arr[j-1]=arr[j];arr[j]=temp;}}}}
🎇4.代码优化(添加标志量)
//对冒泡排序的一点小优化:添加标志量来记录数组是否是有序的public void sort1(int[] arr){if(arr==null||arr.length<2){return;}//思路:借助双循环,进行两两交换,将最大的“气泡”排到数组末尾,同时添加一个标志量,判断数组是否已经排好序了for (int i = 0; i <arr.length-1; i++) {//排n-1趟boolean flag=true;for (int j = 1; j <arr.length-i; j++) {//比较n-1-i次,因为下标是从1开始取的if(arr[j-1]>arr[j]){//两两交换int temp=arr[j-1];arr[j-1]=arr[j];arr[j]=temp;flag=false;//证明还没有排好序}}if(flag){//flag为true,代表排好序了return;}}}
添加标志量后,最快的情况是遍历一遍数组时发现元素没有交换,直接就是有序的,此时只需要遍历一遍数组即可;
🎀快速排序 时间复杂度O(n*logn)
快速排序的最坏运行情况是 0(n^2) ,比如说顺序数列的快排。但它的平期望时间是 O(nlogn),且 (nlogn)记号中隐合的常数因子很小,比复杂度稳定等于 0(nlogn)的归并排序要小很多,所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。它是对冒泡排序的改进,快速排序过程其实对应着二叉树的前序遍历
🎇1. 算法步骤思想
🪀 从数列中挑出一个元素,称为 “基准”(pivot) 中心点
🪀重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准
的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位 置。这个称为分区(partition)操作;
🪀 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
🎇2、动画演示
🏨快速排序的动画演示
相关博客:
🪂(42条消息) 快速排序(过程图解)_曹利荣的博客-CSDN博客_快速排序图解
🪂(42条消息) 史上最详细图解快速排序_文文的博客的博客-CSDN博客_快速排序图解
🎇3.代码实现
public void sort(int[] arr){if(arr==null||arr.length<2){return;}sortDG(arr,0,arr.length-1);}private void sortDG(int[] arr,int left,int right){if(left>=right){//【注意】return;}//思路:先以left为基准点(寄存),创建left、right索引,先与right进行比较,// 如果基准>arr[right],覆盖left++,基准再与left进行比较...直到left==right,填入基准//如果基准<=arr[right],right--,直到满足上述条件;划分左右区间,接着进行快速排序int i=left;int j=right;int rootVal=arr[left];//默认以左边为基准while (i<j){while (rootVal<arr[j]&&i<j){j--;}if(i<j){//【需要判断i是否小于j】arr[i++]=arr[j];}while (rootVal>arr[i]&&i<j){i++;}if(i<j){//【需要判断i是否小于j】arr[j--]=arr[i];}}//插入基准点arr[i]=rootVal;sortDG(arr,0,i-1);//i=j,且这个位置是待插入的基准点下标sortDG(arr,i+1,right);}
相关文章:
十大排序之冒泡排序与快速排序(详解)
文章目录 🐒个人主页🏅算法思维框架📖前言: 🎀冒泡排序 时间复杂度O(n^2)🎇1. 算法步骤思想🎇2.动画实现🎇 3.代码实现🎇4.代码优化(添加标志量) …...
【SpringBoot篇】阿里云OSS—存储文件的利器
文章目录 🌹什么是阿里云OSS⭐阿里云OSS的优点 🏳️🌈为什么要使用云服务OSS🎄使用步骤⭐OSS开通⭐参考官方SDK 🍔编写代码⭐上传文件 🌹综合案例 🌹什么是阿里云OSS 阿里云对象存储…...
Leetcode—58.最后一个单词的长度【简单】
2023每日刷题(四十) Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…...
Apach Ozone部署
前言 最近由于工作需要,要部署一套ozone。我自己对hadoop这套体系不是很熟悉,所以过程磕磕碰碰,好不容易勉强搭起来,所以记录一下部署方式 准备 三台主机,主机均已安装jdk、hdfs,相关的安装配置就不另外写…...
【nlp】3.2 Transformer论文复现:1. 输入部分(文本嵌入层和位置编码器)
Transformer论文复现:输入部分(文本嵌入层和位置编码器) 1 输入复现1.1 文本嵌入层1.1.1 文本嵌入层的作用1.1.2 文本嵌入层的代码实现1.1.3 文本嵌入层中的注意事项1.2 位置编码器1.2.1 位置编码器的作用1.2.2 位置编码器的代码实现1.2.3 位置编码器中的注意事项1 输入复现…...
自动化部署 / 扩容openGauss —— Ansible for openGauss
前言 大家好,今天我们为大家推荐一套基于 Ansible 开发的,自动化部署及扩容 openGauss 的脚本工具:Ansible for openGauss(以下简称 AFO)。 通过AFO,我们只需简单修改一些配置文件,即可快速部署…...
Go 实现网络代理
使用 Go 语言开发网络代理服务可以通过以下步骤完成。这里,我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例。 步骤 1. 安装 golang.org/x/net/proxy 包 使用以下命令安装 golang.org/x/net 包,该包包含 proxy 子包&am…...
Redis报错:JedisConnectionException: Could not get a resource from the pool
1、问题描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析: redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…...
【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?
在数字时代中,传统的展览方式正在被全新的技术和工具所颠覆。其中,最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用,正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…...
Vue项目实战之一----实现分类弹框效果
效果图 实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/vue.js"></script><!-- 引入样式 --><link rel"stylesheet&qu…...
Vue解析器
解析器本质上是一个状态机。但我们也曾提到,正则表达式其实也是一个状态机。因此在编写 parser 的时候,利用正则表达式能够让我们少写不少代码。本章我们将更多地利用正则表达式来实现 HTML 解析器。另外,一个完善的 HTML 解析器远比想象的要…...
Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇
Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇 近日,在对项目中的 Spring Boot、Spring Cloud 以及 Spring Cloud Alibaba 进行版本升级时,遭遇了一个令人头疼的问题:Spring Cloud Gateway 在运行时一直卡住&a…...
面试:Docker相关问题
文章目录 请解释一下什么是 Docker,以及它在云环境中的应用请简述Docker和LXC的区别什么是Docker Compose?请简述其作用和使用场景在使用Docker时,如何为容器创建一个可访问的网络当一个Docker容器运行异常时,如何通过Docker命令查…...
移动端浏览器 jquery 获取 pdf blob文件流 预览pdf
最近遇到一个需求,一个古早的移动端 juery 项目要求做一个页面,从接口获取 pdf 文件流,然后预览出来 这里使用第三方工具:pdf.js 代码如下: // 引入相关文件<script src"../js/pdf.js" type"text…...
Redis并发问题解决方案
目录 前言 1.分布式锁 1.基于单个节点 2.基于多个节点 3.watch(乐观锁) 2.原子操作 1.单命令操作 2.Lua 脚本(多命令操作) 3.事务 1.执行步骤 2.错误处理 3.崩溃处理 总结 前言 在多个客户端并发访问Redis的时候,虽然Redis是单线程执行指令ÿ…...
读取两个文件夹里不同名的文件,处理映射不对应的文件
解决方案:读取两个文件夹里不同名的文件,处理映射不对应的文件 # -*- coding: utf-8 -*- import ospath1 r/home/ubuntu/data/yoloData/images/train2017 path2 r/home/ubuntu/data/yoloData/labels/train2017def read_all_file_name():file_path ./t…...
SpringCloud原理-OpenFeign篇(四、请求原理)
文章目录 前言正文一、书接上回,从代理对象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的实现原理3.1 invoke(...)源码3.2 executeAndDecode(...) 执行请求并解码 四、如何更换client 的实现 附录附1&#…...
什么是工业物联网(IOT)?这样的IOT平台你需要吗?——青创智通
物联网(IOT)是指在互联网上为传输和共享数据而嵌入传感器和软件的互联设备的广泛性网络。这允许将从物理对象收集的信息(数据)存储在专用服务器或云中。通过分析这些积累的信息,通过提供最优的设备控制和方法,可以实现一个更安全、更方便的社会。在智能家…...
MTK Pump Express 快速充电原理分析
1 MTK PE 1.1 原理 在讲正文之前,我们先看一个例子。 对于一块电池,我们假设它的容量是6000mAh,并且标称电压是3.7V,换算成Wh(瓦时)为单位的值是22.3Wh(6000mAh*3.7V);普通的充电器输出电压电流是5V2A(10W),…...
leetcode刷题记录——1991. 找到数组的中间位置
找到数组的中间位置 给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个)。 中间位置 middleIndex 是满足 nums[0] nums[1] … nums[middleIndex-1] nums[middleInd…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
