冒泡排序:简单又易于实现的排序算法

ops/2025/3/1 3:05:07/

大家好,今天我们来聊聊 冒泡排序(Bubble Sort)算法。听名字是不是很简单,感觉就像是水面上泡泡一样?没错,冒泡排序的名字来源于这种排序过程中,较大的元素像气泡一样逐步“冒泡”到数组的顶端。虽然它不是效率最高的算法>排序算法,但它的简单性和易理解性使得它成为计算机科学入门算法之一。

在这篇博客中,我们将一步步了解冒泡排序的工作原理,分析它的时间复杂度,并通过 Java 代码实现这一经典算法

一、什么是冒泡排序?

冒泡排序是一种交换算法>排序算法,它通过多次遍历待排序的元素列表,每次比较相邻的两个元素,如果它们的顺序错误,就交换它们的位置。这样,每一轮比较都会将当前未排序部分的最大元素“冒泡”到正确的位置。

冒泡排序的步骤:
  1. 从数组的第一个元素开始,比较相邻的两个元素。
  2. 如果前一个元素大于后一个元素,则交换它们。
  3. 每一轮遍历都会将当前未排序部分的最大元素移到数组的末尾。
  4. 重复步骤 1 和步骤 2,直到所有元素都排好序。

二、冒泡排序的工作原理

假设我们有一个数组 [5, 3, 8, 4, 2],我们来演示一下冒泡排序的过程:

  1. 第一轮遍历:

    • 比较 535 > 3,交换它们,得到 [3, 5, 8, 4, 2]
    • 比较 585 < 8,不交换
    • 比较 848 > 4,交换它们,得到 [3, 5, 4, 8, 2]
    • 比较 828 > 2,交换它们,得到 [3, 5, 4, 2, 8]
    • 第一轮结束,最大的元素 8 被冒泡到数组的最后。
  2. 第二轮遍历:

    • 比较 353 < 5,不交换
    • 比较 545 > 4,交换它们,得到 [3, 4, 5, 2, 8]
    • 比较 525 > 2,交换它们,得到 [3, 4, 2, 5, 8]
    • 第二轮结束,第二大的元素 5 被冒泡到倒数第二的位置。
  3. 第三轮遍历:

    • 比较 343 < 4,不交换
    • 比较 424 > 2,交换它们,得到 [3, 2, 4, 5, 8]
    • 第三轮结束,第三大的元素 4 被冒泡到倒数第三的位置。
  4. 第四轮遍历:

    • 比较 323 > 2,交换它们,得到 [2, 3, 4, 5, 8]
    • 第四轮结束,剩下的元素已经排好序。

到此为止,整个数组已经排好序了,排序结果是 [2, 3, 4, 5, 8]

三、冒泡排序的时间复杂度

冒泡排序的时间复杂度是 O(n²),其中 n 是数组的元素数量。原因如下:

  • 在最坏的情况下,冒泡排序需要进行 n-1 次遍历,每次遍历最多进行 n-1 次比较和交换操作。
  • 所以,时间复杂度是 O(n²),这也是为什么冒泡排序对于大规模数据集来说效率较低。
最好情况:
  • 如果数组已经是有序的,冒泡排序只需要进行一次遍历,时间复杂度为 O(n)
最坏情况:
  • 如果数组是倒序的,冒泡排序需要进行完全的遍历,时间复杂度为 O(n²)

四、冒泡排序的空间复杂度

冒泡排序是原地算法>排序算法,也就是说它只需要常数级的额外空间来交换元素。因此,它的空间复杂度为 O(1)

下面是一个用 Java 实现的冒泡排序代码:

public static void sort(int[] arr) {int len = arr.length;for (int j = 0; j < len; j++) {for (int i = 0; i < len - j - 1; i++) {if (arr[i] > arr[i + 1]) {int temp = arr[i + 1];arr[i + 1] = arr[i];arr[i] = temp;}}}}

我们输入数组 {64, 34, 25, 12, 22, 11, 90},程序的输出是:

原始数组:
64 34 25 12 22 11 90 
排序后的数组:
11 12 22 25 34 64 90


http://www.ppmy.cn/ops/162118.html

相关文章

一文掌握ADSL拨号代理的搭建方法,及详细使用

文章目录 1. 准备工作1.1 硬件和网络要求1.2 软件要求2. ADSL 拨号配置2.1 在 Linux 系统中配置 ADSL 拨号2.2 在 Windows 系统中配置 ADSL 拨号3. 搭建代理服务器3.1 安装 Squid3.2 测试代理4. 实现 ADSL 拨号代理4.1 自动拨号脚本4.2 代理 IP 轮换5. 结合爬虫使用5.1 在 Requ…

常见后端开发面试问题(持续更新)

mysql为什么采用B+树作为索引? 首先,B+树相比于B树来说非叶子节点上只有索引没有数据,数据都在叶子节点,就使其非常适合进行范围查询。因为对于Mysql这种数量级非常大的数据来说可以减少磁盘的I/O次数,同时其在叶子节点添加的有指针,可以更加快速的进行查找。平均查找时…

HTML邮件的制作以及可能遇到的问题

HTML 邮件制作方法 规划结构&#xff1a;通常由头部、主体和尾部构成。头部含发件人信息、主题等元数据&#xff1b;主体是核心&#xff0c;有文本、图片、链接等&#xff1b;尾部有版权信息、联系方式等。编写代码&#xff1a; 布局&#xff1a;优先用 table 布局&#xff0c;…

算法与数据结构(二叉树中的最大路径和)

题目 思路 这道题我们可以考虑用递归来解决。 首先设计一个maxPath函数用来递归计算二叉树中一个节点的最大贡献值&#xff0c;具体来说&#xff0c;就是以该节点为根节点的子树中寻找以该节点为起点的一条路径&#xff0c;使得该路径上的节点值之和最大。 如果该节点为空&a…

docker和k8s

1. docker的几种网络模式 1.1. bridge模式&#xff08;默认&#xff09; container有自己的ip&#xff0c;它的ip映射到主机的docker0这个虚拟网卡上&#xff0c;它们能访问外网&#xff0c;外网不能访问它们&#xff08;外网要访问&#xff0c;可以加通过端口映射&#xff0…

【缓冲区】数据库备份的衍生问题,缓冲区是什么,在哪里?(一)

【缓冲区】数据库备份的衍生问题&#xff0c;缓冲区是什么&#xff0c;在哪里&#xff1f;&#xff08;一&#xff09; 缓冲区是操作系统和 Java 运行时环境&#xff08;JVM&#xff09;内部的一个机制&#xff0c;你无法直接看到它&#xff0c;因为它是由操作系统和 JVM 管理…

Scala Trait(特征)

Scala Trait(特征) Scala 语言作为一种多范式编程语言,结合了面向对象和函数式编程的特性。在 Scala 中,Trait 是一种非常灵活的抽象机制,类似于 Java 中的接口和 C++ 中的类混合。本文将详细介绍 Scala 中的 Trait,包括其定义、使用方法以及与类的关系。 什么是 Scala…

智能优化算法:雪橇犬优化算法(Sled Dog Optimizer,SDO)求解23个经典函数测试集,MATLAB

一、雪橇犬优化算法 算法简介&#xff1a;雪橇犬优化算法&#xff08;Sled Dog Optimizer&#xff0c;SDO&#xff09;是2024年10月发表于JCR1区、中科院1区SCI期刊《Advanced Engineering Informatics》的新型仿生元启发式算法。它模拟雪橇犬的拉雪橇、训练和退役行为构建模型…