java-冒泡排序 1
## Java中的冒泡排序
### 1. 冒泡排序的基本概念
冒泡排序(Bubble Sort)是一种简单且直观的排序算法。它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置,使较大的元素逐步从列表的一端移动到另一端,就像气泡在水中上升一样。冒泡排序的核心思想是逐步将最大的元素“冒泡”到列表的末尾。
### 2. 冒泡排序的工作原理
冒泡排序通过多次遍历列表,每次遍历将相邻的两个元素进行比较,如果顺序错误就交换它们。每次完整的遍历后,最大的元素会被移动到列表的末尾。这个过程会重复进行,直到整个列表有序为止。
#### 2.1 示例
假设有一个待排序的数组`[5, 3, 8, 4, 2]`,冒泡排序的过程如下:
- 初始状态:[5, 3, 8, 4, 2]
- 第一次遍历:
- 比较5和3,交换,数组变为:[3, 5, 8, 4, 2]
- 比较5和8,不交换,数组不变:[3, 5, 8, 4, 2]
- 比较8和4,交换,数组变为:[3, 5, 4, 8, 2]
- 比较8和2,交换,数组变为:[3, 5, 4, 2, 8]
- 第二次遍历:
- 比较3和5,不交换,数组不变:[3, 5, 4, 2, 8]
- 比较5和4,交换,数组变为:[3, 4, 5, 2, 8]
- 比较5和2,交换,数组变为:[3, 4, 2, 5, 8]
- 比较5和8,不交换,数组不变:[3, 4, 2, 5, 8]
- 第三次遍历:
- 比较3和4,不交换,数组不变:[3, 4, 2, 5, 8]
- 比较4和2,交换,数组变为:[3, 2, 4, 5, 8]
- 比较4和5,不交换,数组不变:[3, 2, 4, 5, 8]
- 比较5和8,不交换,数组不变:[3, 2, 4, 5, 8]
- 第四次遍历:
- 比较3和2,交换,数组变为:[2, 3, 4, 5, 8]
- 比较3和4,不交换,数组不变:[2, 3, 4, 5, 8]
- 比较4和5,不交换,数组不变:[2, 3, 4, 5, 8]
- 比较5和8,不交换,数组不变:[2, 3, 4, 5, 8]
经过四次遍历后,数组已经有序:[2, 3, 4, 5, 8]。
### 3. 冒泡排序的实现
在Java中实现冒泡排序非常简单,可以通过嵌套的`for`循环来实现。
#### 3.1 基本实现
```java
public class BubbleSort {
public static void bubbleSort(int[] array) {
int n = array.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (array[j] > array[j + 1]) {
// 交换array[j]和array[j + 1]
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] array = {5, 3, 8, 4, 2};
bubbleSort(array);
System.out.println("Sorted array:");
for (int i : array) {
System.out.print(i + " ");
}
}
}
```
在这个实现中,外层循环控制遍历的次数,内层循环用于比较和交换相邻的元素。每次内层循环结束后,最大的元素被移动到列表的末尾。
### 4. 优化冒泡排序
冒泡排序的效率不高,尤其是在处理较大数据集时。可以通过一些优化来提高其性能。
#### 4.1 提前终止
如果在某次遍历中没有发生任何交换,说明数组已经有序,可以提前终止排序。
```java
public class OptimizedBubbleSort {
public static void bubbleSort(int[] array) {
int n = array.length;
boolean swapped;
for (int i = 0; i < n - 1; i++) {
swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (array[j] > array[j + 1]) {
// 交换array[j]和array[j + 1]
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
swapped = true;
}
}
// 如果没有交换发生,提前终止
if (!swapped) break;
}
}
public static void main(String[] args) {
int[] array = {5, 3, 8, 4, 2};
bubbleSort(array);
System.out.println("Sorted array:");
for (int i : array) {
System.out.print(i + " ");
}
}
}
```
### 5. 冒泡排序的时间复杂度
冒泡排序的时间复杂度取决于输入数据的初始顺序。
- 最好情况:当数组已经有序时,只需要进行一次遍历即可终止,时间复杂度为O(n)。
- 最坏情况:当数组完全逆序时,需要进行n-1次遍历,时间复杂度为O(n^2)。
- 平均情况:时间复杂度为O(n^2)。
冒泡排序的空间复杂度为O(1),因为它只需要常数级别的额外空间用于交换元素。
### 6. 冒泡排序的稳定性
冒泡排序是一个稳定的排序算法,即如果两个元素相等,它们在排序后的相对顺序不会改变。这是因为冒泡排序在交换元素时,只会交换相邻的元素,不会跨过其他相等的元素。
### 7. 冒泡排序的适用场景
由于冒泡排序的时间复杂度较高,它通常不适用于大型数据集的排序。然而,冒泡排序的实现非常简单,因此在某些简单或特定的场景下仍然可以使用,例如:
- 学习和教学:冒泡排序是许多初学者学习排序算法的入门算法。
- 小型数据集:对于非常小的数据集,冒泡排序的性能尚可。
- 数据近乎有序:如果数据集大部分已经有序,冒泡排序的优化版本可以高效地完成排序。
### 8. 冒泡排序的可视化
为了更好地理解冒泡排序的工作原理,可以将排序过程进行可视化。以下是一个简单的示例,展示了如何通过打印每次遍历后的数组状态来可视化排序过程。
```java
public class VisualBubbleSort {
public static void bubbleSort(int[] array) {
int n = array.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (array[j] > array[j + 1]) {
// 交换array[j]和array[j + 1]
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
// 打印当前状态
printArray(array);
}
}
public static void printArray(int[] array) {
for (int i : array) {
System.out.print(i + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] array = {5, 3, 8, 4, 2};
bubbleSort(array);
System.out.println("Sorted array:");
printArray(array);
}
}
```
在这个示例中,每次内层循环结束后,数组的当前状态会被打印出来,帮助我们直观地观察排序过程。
相关文章:
java-冒泡排序 1
## Java中的冒泡排序 ### 1. 冒泡排序的基本概念 冒泡排序(Bubble Sort)是一种简单且直观的排序算法。它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置,使较大的元素逐步从列表的一端移动到另一端,就像…...
【STM32】USART串口通讯
1.USART简介 STM32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写, 即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART, 它还有具有UART外设(Univers…...
Qt6中如何将QList转为QSet?
QSet是一个具有唯一值的哈希集合。比较少用。比较有用的是QSet里面的intersect查找两个集合中不同元素,并合并。 转换过程比较简单,第一种是直接用迭代器。 QSet<int> set(list.begin(), list.end()); 第二种就是逐一遍历赋值: QLi…...
aspectj:AOP编程备忘录-切面定义的注意事项
AOP编程时定义切面时需要注意的事 Around 以Around注解拦截构造方法(Constructor)时切面定义只能用call方式而不能是execution,否则 ProceedingJoinPoint.proceed()返回的是null,得不到构造的实例。 execution execution切入点要修改对象内部&#x…...
大数据面试题之Hive(1)
目录 说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么? 说下Hive是什么?跟数据仓库区别? Hive架构 Hive内部表和外部表的区别? 为什么内部表的删除,就会将数据全部删除,而外部表只删除表结构?为什么用外部表更好? Hive建表语句?创建表…...
【Git】分布式版本控制工具
一、简介 二、目标 Git分布式版本控制工具 一、简介 Git是一种分布式版本控制系统,用于跟踪和管理源代码的变化。它由林纳斯托瓦兹(Linus Torvalds)于2005年开发,并迅速成为最流行的版本控制工具之一。以下是关于Git的一些关键…...
排序之插入排序----直接插入排序和希尔排序(1)
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记,欢迎大家在评论区交流讨…...
快速创建条形热力图
Excel中的条件格式可以有效的凸显数据特征,如下图中B列所示。 现在需要使用图表展现热力条形图,如下图所示。由于颜色有多个过渡色,因此手工逐个设置数据条的颜色,基本上是不可能完成的任务,使用VBA代码可以快速创建这…...
go switch 与 interface
go switch 与 interface 前言 前言 github.com/google/cel-go/common/types/ref type Val interface {// ConvertToNative converts the Value to a native Go struct according to the// reflected type description, or error if the conversion is not feasible.ConvertTo…...
BaseMapper 接口介绍
基于 mybatis-mapper/provider 核心部分实现的基础的增删改查操作,提供了一个核心的 io.mybatis.mapper.BaseMapper 接口和一个 预定义 的 io.mybatis.mapper.Mapper 接口,BaseMapper 接口定义如下: /*** 基础 Mapper 方法,可以在…...
HAL-Cubemax定时器使用记录
title: HAL-Cubemax定时器使用记录 tags: STM32HalCubemax 文章目录 HAL-Cubemax定时器使用记录分享一种思路1.创建一个ms(毫秒)级延时中断2.创建计数的变量3.在需要延时的函数中对变量阈值进行判断4.验证实例--完整使用记录代码 问题往期内容基础库HAL cubemax VSCODE GCC …...
同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?
在智能手机的世界里,续航能力一直是用户关注的焦点。苹果公司以其创新的MagSafe技术和传统的Lightning接口,为iPhone用户提供了多样化的充电解决方案。 然而,当这两种技术同时使用时,它们能否带来更快的充电速度?本文…...
零成本搭建个人图床服务器
前言 图床服务器是一种用于存储和管理图片的服务器,可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片,就可以集中放到图床里,既方便多平台文章发布,又能统一管理和备份。 当然下面通过在 Git…...
SpringBoot 搭建sftp服务 实现远程上传和下载文件
maven依赖: <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>application.yml sftp:protocol: sftphost: port: 22username: rootpassword: sp…...
IDEA中使用leetcode 刷题
目录 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 算法题来了不畏惧, 挑战前行是成长的舞台…...
华为海思CPU解读
安全可靠CPU测评结果(华为海思篇) 中国信息安全测评中心于2024年5月20日发布安全可靠测评结果公告(2024年第1号),公布依据《安全可靠测评工作指南(试行)》的测评结果,自发布起有效期…...
中介子方程三十三
XXFXXuXXWXXuXXdXXrXXαXXuXpXXdXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXdXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXdXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXdXXpXuXXαXXrXXEXXyXXαXiXXαXiXrXkXtXyXXpXVXXdXuXWX…...
今年哪两个行业可能有贝塔?
银行和综合板块存在比较明显的行业贝塔,背后原因是:银行板块中,最小的几家银行市值也不小;综合板块中,最大的几家市值也不大。 一、今年哪两个行业可能有贝塔? 我们一直强调今年市场呈现出【行业弱beta、风…...
嵌入式软件开发工具使用介绍
软件开发工具 辅助开发工具 硬件工具与仪器设备 逻辑分析仪使用 串口数据解码分析 示波器使用 1.示波器简介 TBS 1052B(Tektronix)系列数字存储示波器在紧凑的设计中提供了经济的性能。 由于多种标配功能, 包括 USB 连接、34 种自动测量、…...
【TB作品】MSP430G2553,单片机,口袋板, 交通灯控制系统
题8 交通灯控制系统 十字路口交通灯由红、绿两色LED显示器(两位8段LED显示器)组成,LED显示器显示切换倒计时,以秒为单位,每秒更新一次;为确保安全,绿LED计数到0转红,经5秒延时&#…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
