Java【冒泡排序】算法, 大白话式图文解析(附代码)
创始人
2025-05-28 04:41:54
0

文章目录

  • 一、排序相关概念
    • 1, 什么是排序
    • 2, 什么是排序的稳定性
    • 3, 七大排序分类
  • 二、冒泡排序
    • 1, 图文解析
    • 2, 代码实现
    • 3, 冒泡排序的优化
  • 三、性能分析
  • 四、七大排序算法总体分析

提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎评论区指点~ 废话不多说,直接发车~


一、排序相关概念

1, 什么是排序

📌排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增📈或递减📉的排列起来的操作

👉以 int 类型数据从小到大排序为例:
排序前:4,1,3,6,8,7,2,5
排序后:1,2,3,4,5,6,7,8


2, 什么是排序的稳定性

📌稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

👉以 int 类型数据从小到大排序为例:
排序前:4,1,3a,6,8,7,2,3b,5(3a 在 3b 之前)
排序后:1,2,3a3b,4,5,6,7,8(3a 还在 3b 之前,稳定)
排序后:1,2,3b3a,4,5,6,7,8(3a 不在 3b 之前,不稳定)

3, 七大排序分类

以下是常见的 7大排序 算法
在这里插入图片描述


二、冒泡排序

1, 图文解析

📌冒泡排序是一种交换排序,他的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到有序为止

冒泡应该是最早接触的一种排序算法了,因为它很简单易懂,尽管如此,还是来看一看冒泡的图解过程:
注意 i , j 下标的变化
在这里插入图片描述
在这里插入图片描述
❓❓❓为什么 每趟冒泡排序之后, i++;而 j 总是从0下标开始呢,
因为一趟冒泡排序结束后只是做到了把 待排序数据的最大值 放在 待排序数据的最后, 而最小值不一定在最前面,所以 i 要从 0 下标开始重新找目前待排序数组的最大值,让他往后放, 循环往复, 最后剩下的那个数据一定是最小的


2, 代码实现

    /*** 冒泡排序* 时间复杂度:最坏 O(N*N) 最好 O(N)* 时间复杂度:O(1)* 稳定性:稳定*/public static void bubleSort(int[] array){for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length - i - 1; j++) {if (array[j] > array[j + 1]) {swap(array, j, j + 1);}}}}

3, 冒泡排序的优化

其实 j < array.length - i - 1; 这一句代码也是经过简单的优化的, 避免了 j 的无效循环🔄

但这 还是存在效率较低 的情况, 当 待排数据有序 时, i 还是会继续遍历, 从而带动 j 的遍历, 是纯纯浪费❌

👉所以对上述代码的优化方案是:
每次 i 开始循环时 定义一个标记 false , 如果 j 遍历完数组, 发生了交换, 把 false 改成 true , 如果 j 的循环结束发现标记还是false,说明什么?
说明没有发生交换, 待排数据是整体有序的, 那么就不让 i 继续遍历了,直接返回即可

优化后代码:

    public static void bubleSort(int[] array){for (int i = 0; i < array.length; i++) {boolean mark = false;for (int j = 0; j < array.length - i - 1; j++) {if (array[j] > array[j + 1]) {swap(array, j, j + 1);mark = true;}}if (mark == false) {return;}}}

三、性能分析

👉时间复杂度:
最好情况下(数组整体有序),也需要 j 遍历一遍数组,时间复杂度是O(N)
最坏情况下(数组逆序),此时时间复杂度是O(N^2)

👉空间复杂度:
没有额外空间的开销,只有常数个记录的辅助空间,空间复杂度是O(1)

👉稳定性:
稳定

只要是交换时, 两数据相邻就是稳定的算法,只要是跳跃式的交换就是不稳定, 当然别忘了, 稳定的算法也可以修改代码更改成不稳定的


四、七大排序算法总体分析

建议对七大算法都有认识之后, 再对比分析~~

没有完美的排序算法,任何一种算法都是有优点和缺陷的,即便是大名鼎鼎的快速排序,也只是整体上效率比较高,性能相对更优越

现在就整体分析一下各种排序的优缺点📊
在这里插入图片描述

早期的排序算法平均时间复杂度都是O(N^2); 因为原理比较简单, 但性能较差, 所以 一般把直接插入排序,选择排序,冒泡排序归为简单排序一类 其他的都归于 改进排序

📚从平均情况看:
改进过的排序: 希尔排序, 堆排序, 归并排序, 快速排序要胜过 简单排序的性能, 而四个改进算法中, 希尔排序的性能最差

📚从最好情况看:
直接插入排序和冒泡排序最快

📚从最坏情况看:
堆排序和归并排序的性能更胜过快排和其他简单排序

📚综合来看:
堆排序和归并排序比较稳定和强大, 情况最坏时好使
直接插入排序和冒泡排序在基本有序时最好用,
而快速排序比较极端, 最好最坏情况都有缺陷 但是 快速排序能够称之为快速排序, 是因为它的综合性能最强💪,一般情况下是最快的

📚从稳定性来看:
改进排序中只有归并排序

📚从数据个数上看:
数据量越少, 越适合用简单排序, 因为堆排, 快速排序, 归并排序, 都用到了递归, 对于少量数据排序有点"炮弹打蚊子"


如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

相关内容

热门资讯

Linux:使用libeven... 代码: #include #include #include #include ...
html入门学习 HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不...
安全知识小结 1.cookic和session你第一次注册网站时,网站会将你的用户名、加密后的密码、...
ssh介紹以及 linux 下... ssh介紹以及 linux 下ssh的安裝使用SSH协议简介SSH 的工作过程linux(ubunt...
Sentinel:流量控制规则... 一、概述 FlowSlot 会根据预设的规则,结合前面 NodeSelectorSlo...
学习笔记七:docker容器互... docker容器互联容器的网络基础docker0:安装网桥管理工具:do...
面试阿里测开岗失败后,被面试官... 前一阵子有个徒弟向我诉苦,说自己在参加某大厂测试面试的时候被面试官怼得哑口无言...
CCNP300-410学习笔记... 151、 Refer to the exhibits An engineer filtered m...
kubernetes核心组件原... 文章目录核心组件原理1、RC[控制器]2、RS[控制器]3、Deployment4、HPA5、Sta...
华为OD机试 - 数组组成的最... 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真...
java.sql.Time 字... 项目场景: 情况:最近有一个很奇怪的事情,项目已经上线了一...
一文读懂!跨境支付业务详解 随着全球电子商务的增长,面向进出口贸易的跨境支付应运而生。据华创微课统计,...
MySQL的隐式类型转换 引入 在项目中调用别的部门的模糊查询接口,发现还根据模糊字段搜索主键,还...
redis教程3 (特性以及五... redis 特性以及五种数据类型的编码特点适用场景redis特性优势(快)...
理解 zk-SNARKs 和 ... SNARK 和 STARK 是零知识证明技术,允许一方在不透露任何进一步信息的情况下向...
【JavaSE】继承的详解 前言 大家好,我是那个不会打拳的程序猿。今天我给大家带来的是面向对象之封装继承多态中...
Delta并联机械臂实现电磁铁... 1. 功能说明 本文示例将利用Delta并联机械臂实现不同点定点搬运磁铁物料的效果。  2. 结构...
高标准农田信息化监测系统解决方... 一、方案背景 《中共中央国务院关于做好2023年全面推进乡村振兴重点工作的意见》指出,...
从0开始实现java Stre... java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式...
Windows_安装整合Pro... 安装包下载 prometheus windows_exporter pushgateway graf...