Java 实现冒泡排序:[通俗易懂的排序算法系列之二]

引言

大家好!欢迎来到我的排序算法系列第二篇。今天,我们将学习另一种非常基础且广为人知的排序算法——冒泡排序 (Bubble Sort)

冒泡排序的名字非常形象,它模拟了水中气泡上升的过程:较小(或较大)的元素会像气泡一样,通过不断交换,逐渐“浮”到数组的一端。


什么是冒泡排序?

冒泡排序的核心思想是:重复地遍历待排序的序列,每次遍历比较相邻的两个元素,如果它们的顺序错误(例如,在升序排序中,前面的元素大于后面的元素),就交换它们的位置。

这个过程会一直重复,直到在某一次遍历中没有发生任何元素交换,这意味着整个序列已经排序完成。

想象一下:

  1. 第一轮: 从第一个元素开始,依次比较相邻的两个元素。如果顺序不对就交换。这一轮结束后,最大的元素会被移动到数组的末尾
  2. 第二轮: 再次从第一个元素开始,比较相邻元素并交换(如果需要),但这次只需要比较到倒数第二个元素,因为最后一个元素已经是最大的了。这一轮结束后,第二大的元素会被移动到倒数第二的位置。
  3. 重复这个过程: 每一轮都将当前未排序部分的最大元素“冒泡”到其最终位置。比较的范围也逐渐缩小。

算法步骤详解 (以升序为例)

假设我们有数组 [5, 1, 4, 2, 8]

  1. 第 1 轮 (比较 n-1 次 = 4次):

    • 比较 51 -> 1 > 5? 否 -> 5 > 1? 是 -> 交换 -> [1, 5, 4, 2, 8]
    • 比较 54 -> 5 > 4? 是 -> 交换 -> [1, 4, 5, 2, 8]
    • 比较 52 -> 5 > 2? 是 -> 交换 -> [1, 4, 2, 5, 8]
    • 比较 58 -> 5 > 8? 否 -> 不交换 -> [1, 4, 2, 5, 8]
    • 结果: 最大元素 8 已就位。下次只需比较前 4 个。
  2. 第 2 轮 (比较 n-2 次 = 3次):

    • 比较 14 -> 1 > 4? 否 -> 不交换 -> [1, 4, 2, 5, 8]
    • 比较 42 -> 4 > 2? 是 -> 交换 -> [1, 2, 4, 5, 8]
    • 比较 45 -> 4 > 5? 否 -> 不交换 -> [1, 2, 4, 5, 8]
    • 结果: 第二大元素 5 已就位。下次只需比较前 3 个。
  3. 第 3 轮 (比较 n-3 次 = 2次):

    • 比较 12 -> 1 > 2? 否 -> 不交换 -> [1, 2, 4, 5, 8]
    • 比较 24 -> 2 > 4? 否 -> 不交换 -> [1, 2, 4, 5, 8]
    • 结果: 第三大元素 4 已就位。下次只需比较前 2 个。
  4. 第 4 轮 (比较 n-4 次 = 1次):

    • 比较 12 -> 1 > 2? 否 -> 不交换 -> [1, 2, 4, 5, 8]
    • 结果: 第四(小)大元素 2 已就位。数组排序完成。

Java 代码实现

下面提供了两种冒泡排序的 Java 实现:基础版和优化版。

1. 基础冒泡排序 (bubbleSort1)

这是最经典的冒泡排序实现。

import java.util.Arrays;public class BubbleSort { // 类名建议大写开头public static void main(String[] args) {int[] arr = {31, 25, 18, 16, 19, 82, 71

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

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

相关文章

struct结构体、union联合体和枚举

目录 一、结构体的声明和使用 1.1 结构体正常声明和创建 1.2 结构体特殊声明 1.3 结构体的自引用 二、结构体内存对齐 2.1 对齐规则 2.2 #pragma修改 三、结构体传参 四、结构体位段 4.1 位段内存分配 4.2 位段内存应用 五、结构体中的柔性数组概念 六、union联合…

大模型本地部署系列(2) Ollama部署DeepSeek-R1

成功运行截图 部署步骤 我们进入到ollama的官网: Ollama​ollama.com/​编辑 找到上方的Models ,然后点击 此时会跳转到模型列表页面: 点击 deepseek-r1 链接进去,此时我们会看到下拉框中有各个版本的大模型,越往后…

绘制动态甘特图(以流水车间调度为例)

import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np from matplotlib import cm# 中文字体配置(必须放在所有绘图语句之前) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

PyTorch实现线性回归的基础写法与封装API写法

目录 1. 基础写法 1.1导包 2.2加载读取数据 2.3原始数据可视化(画图显示) 2.4线性回归的(基础)分解写法 2.5定义训练过程 2.PyTorch实现 线性回归的封装写法(实际项目中的常用写法) 2.1创建线性回归模型 2.2定义损失函数 2.3定义优化器 2.4定义训练过程 1…

python 常用的6个爬虫第三方库

Python中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析为树形…

基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)

基于BP神经网络的杂草智能识别系统 项目介绍 本项目是一个基于PyQt5和BP神经网络的杂草智能识别系统。系统通过图像处理和神经网络技术, 能够识别8种不同的杂草类别。用户可以通过上传图片,系统会自动识别图片中的杂草类别,并显示识别结果和…

Python3笔记之号称替代pip的uv包管理器

uv是什么? uv,这是一个由 Astral 团队开发的极快速的Python包和项目管理工具,用Rust语言编写。它集成了多种功能,旨在替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等多个工具,提供更高效、更全面的Py…

IT管理思路

甲方CIO和IT管理者-如何做好组织级IT能力提升_哔哩哔哩_bilibili

ChatGPT的GPT-4o创建图像Q版人物提示词实例展示

最近感觉GPT-4o发布的新功能真的强大,所以总结了一些提示词分享给大家,大家可以去试试,玩法多多,可以用GPT-4o生成图片,然后用可灵进行图生视频,就能去发布视频了!接下来和笔者一起来试试&#…

Transformer Decoder Block的几个优化方案

写在前面 在大型语言模型(LLM)的演进浪潮中,Transformer 架构凭借其强大的并行计算能力和对长距离依赖的出色捕捉,奠定了核心地位。然而,标准的 Transformer Decoder Block 遵循着一种相对固定的模式:先进行自注意力(Self-Attention)捕捉上下文信息,再通过前馈神经网…

五种IO模型与select和poll分别实现多路转接

五种IO模型与select和poll分别实现多路转接 何为IO 不论是在前面文件部分,还是后面的网络部分,IO都是非常常见的。但是当时只是简单对IO进行提及,并没有对IO的本质进行介绍。那么到底何为IO?IO全称为输入和输出,而任…

单例模式的写法(保证线程安全)

1. 引言 1.1 什么是单例模式? 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。 核心思想:控制实例化过程,避免重复创建对象。 1.2 为什么…

C++ 环境设置

C++ 环境设置 引言 C++作为一种高性能的编程语言,广泛应用于系统软件、游戏开发、实时系统等领域。为了能够顺利进行C++编程,我们需要在计算机上配置合适的开发环境。本文将详细讲解如何在Windows、macOS和Linux系统中设置C++开发环境。 Windows系统下C++环境设置 1. 安装…

【Kafka基础】ZooKeeper在Kafka中的核心作用:分布式系统中枢神经系统

在分布式系统的世界里,协调和管理多个节点间的状态是一项复杂而关键的任务。Apache Kafka作为一款高性能的分布式消息系统,其设计哲学是"专为单一目的而优化"——即高效处理消息流。为了实现这一目标,Kafka选择将集群协调管理的重任…

<《AI大模型应知应会100篇》第8篇:大模型的知识获取方式及其局限性

第8篇:大模型的知识获取方式及其局限性 摘要 大模型(如GPT、BERT、Qwen、DeepSeek等)凭借其卓越的自然语言处理能力,已经成为人工智能领域的明星。然而,这些模型“知道”什么?它们如何获取知识&#xff1f…

ESModule和CommonJS在Node中的区别

ESModule console.log(require);//>errorconsole.log(module);//>errorconsole.log(exports);//>errorconsole.log(__filename);//>errorconsole.log(__dirname);//>error全部报错commonjs console.log(require);console.log(module);console.log(exports);co…

Spring Boot 配置文件加载优先级全解析

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 配置文件加载优先级全解析 Spring Boot 的配置文件加载机制是开发者管理不同环境配置的核心功能之一。其通过外部化配置(Externaliz…

2025 年陕西消防设施操作员考试攻略:历史文化名城的消防传承与创新​

陕西拥有丰富的历史文化遗产,众多古建筑分布其中,同时也在不断推进现代化建设,消防工作面临传承与创新的双重任务,这在考试中也有所体现。​ 考点融合与特色:一方面,古建筑的消防保护是重点,包…

【Unity网络编程知识】C#的 Http相关类学习

1、搭建HTTP服务器 使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用)自己编写HTTP服务器应用程序,一般作为Web服务器或者短连接游戏服务器时使用该方式(工作后由后端程序员来做&#…

Android Studio - 解决 Please Select Android SDK

一、出现的问题 点击 Run 后弹窗,图一位置出现图二提示。 二、解决办法 进入 Tools -> SDK Manager,在 Android SDK Location 点击 Edit,一直 Next 就解决了。