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); 因为原理比较简单, 但性能较差, 所以 一般把直接插入排序,选择排序,冒泡排序归为简单排序一类 其他的都归于 改进排序

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

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

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

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

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

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


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


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

相关内容

热门资讯

优酷安卓9.0系统版本,畅享流... 你有没有发现,最近你的优酷APP是不是有点不一样了?没错,就是那个我们每天离不开的追剧神器——优酷,...
安卓手机系统体验排名,揭秘最佳... 你有没有发现,现在手机市场上安卓手机的品牌和型号简直多到让人眼花缭乱?每个品牌都试图在系统体验上大显...
安卓操作系统技巧在哪,安卓操作... 你有没有发现,安卓手机用久了,总感觉有点慢吞吞的?别急,今天就来给你支几招,让你的安卓手机焕发第二春...
安卓手机哪个系统最快,揭秘最快... 你有没有想过,为什么你的安卓手机有时候会慢吞吞的,像是老牛拉破车一样?别急,今天就来给你揭秘安卓手机...
安卓非系统允许程序,探索安卓非... 你知道吗?在安卓手机的世界里,除了那些系统自带的程序,还有很多“外来客”在悄悄地占领着你的手机空间。...
qq飞车安卓系统和苹果系统,安... 你有没有发现,最近QQ飞车这款游戏在安卓系统和苹果系统上可是火得一塌糊涂啊!不管是走在街头,还是坐在...
安卓系统页面不显示时间,安卓系... 手机屏幕上那时间怎么突然消失了呢?是不是你也遇到了安卓系统页面不显示时间的问题?别急,今天就来给你详...
怎么修改安卓系统设备,揭秘安卓... 手机用久了是不是觉得卡得要命?别急,今天就来教你怎么修改安卓系统设备,让你的手机焕发第二春!一、清理...
安卓平板刷车载系统固件,体验智... 你有没有想过,你的安卓平板不仅能陪你追剧、玩游戏,还能变身成为车载系统的得力助手呢?没错,就是那种让...
安卓要不要系统更新系统,守护安... 亲爱的安卓用户们,你是不是也经常被手机弹出的系统更新通知搞得头都大了?是不是在犹豫,这更新到底要不要...
电视机安卓系统则,体验升级 你有没有发现,现在的电视机越来越智能了?尤其是那些搭载了安卓系统的电视机,简直就像是个小机器人,不仅...
安卓系统打开动画效果,打开动画... 你有没有发现,每次打开安卓手机,那瞬间闪现的动画效果,就像是一场视觉盛宴呢?今天,就让我带你一起探索...
安卓系统的诞生和发展,安卓系统... 你有没有想过,手机里的那个小小的操作系统,竟然能改变我们的生活呢?没错,我要说的就是安卓系统。它就像...
安卓系统电话通话录音,捕捉真实... 你有没有想过,在繁忙的生活中,有时候一个电话的录音就能帮你回忆起重要的信息或者关键时刻的对话内容呢?...
安卓64位系统官方下载,解锁全... 你有没有发现,最近你的安卓手机好像有点卡卡的呢?别急,别急,今天就来给你揭秘一下如何给你的安卓手机升...
安卓8系统可以吗,创新与变革的... 你有没有听说安卓8系统?最近这个话题在数码圈可是火得一塌糊涂呢!不少朋友都在问我:“安卓8系统可以吗...
安卓系统电量显示不正,揭秘原因... 手机电量显示不准确,是不是你也遇到了这样的烦恼?每次看着那忽上忽下的电量百分比,心里是不是直发慌?别...
安卓平板开票系统怎么用,轻松实... 你有没有想过,拥有一台安卓平板,不仅能随时随地办公学习,还能轻松搞定开票业务呢?没错,现在就让我来带...
安卓系统怎样下载尚德,安卓系统... 你有没有想过,想要在安卓系统上下载尚德,其实就像是在茫茫书海中找到一本宝藏呢?别急,让我来带你一步步...
安卓5系统自带相机软件,系统自... 你有没有发现,自从你升级到了安卓5系统,手机里的相机软件好像变得不一样了呢?没错,就是那个我们每天都...