java 冒泡排序,涵盖背景、算法步骤、代码示例、复杂度分析、优化方式及其优缺点

news/2025/3/9 10:43:51/文章来源:https://www.cnblogs.com/HQING/p/18611339

冒泡排序的背景知识
冒泡排序是一种简单的排序算法,由于其简单易懂的特点,它通常被用作教学目的。冒泡排序在最坏情况下的效率并不高,但在某些特定条件下,它的表现可以相对较好。下面是更深入的细节。

动画演示


1. 算法步骤详解
1.1 基本逻辑
冒泡排序的核心逻辑是比较和交换。我们需要反复遍历待排序的数组,每次将最大的元素“冒泡”到未排序部分的末尾。

1.2 具体步骤
输入数据:准备一个待排序的数组。例如:[64, 34, 25, 12, 22, 11, 90]。
确定长度:计算数组的长度 n。
外层循环:设置一个循环,控制排序的轮数,从 0 到 n-1。
每轮将最大的元素移动到当前未排序部分的末尾。
内层循环:设置一个循环,比较相邻的元素。
从 0 到 n-1-i(每轮后,最大的元素已在末尾,因此无需再比较)。
比较与交换:
若当前元素大于下一个元素,则交换它们的位置。
使用一个临时变量保存当前元素的值以便交换。
优化:如果某一轮中没有交换,说明数组已排序,可以提前结束。
2. 代码示例
以下是更详细的 Java 实现代码,包括注释以便理解每一步的作用:

public class BubbleSort {
// 冒泡排序方法
public static void bubbleSort(int[] arr) {
int n = arr.length; // 获取数组的长度
boolean swapped; // 交换标志// 外层循环控制排序的轮数
for (int i = 0; i < n - 1; i++) {
swapped = false; // 每一轮开始时,初始化交换标志为 false// 内层循环进行相邻元素的比较
for (int j = 0; j < n - 1 - i; j++) {
// 如果当前元素大于下一个元素,则交换
if (arr[j] > arr[j + 1]) {
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true; // 设置标志,表示发生了交换
}
}// 如果没有发生交换,数组已经有序,提前结束
if (!swapped) {
break; // 提前结束外层循环
}
}
}public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90}; // 待排序的数组
bubbleSort(arr); // 调用冒泡排序方法
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " "); // 输出排序后的数组
}
}
}

 

3. 时间复杂度分析
最坏情况:O(n²)
当输入数组是逆序时,冒泡排序需要进行最多的比较和交换。
平均情况:O(n²)
在随机情况下,冒泡排序的时间复杂度仍然是 O(n²)。
最好情况:O(n)
当输入数组已经有序时,经过一轮遍历后不再需要交换,可以提前结束。
4. 空间复杂度分析
冒泡排序的空间复杂度为 O(1),因为它只需要一个临时变量用于交换,不需要额外的存储空间。

5. 优化方法
提前结束:如果在某一轮中没有进行任何交换,说明数组已经有序,可以提前终止算法。
减少比较次数:每完成一轮排序后,已排好的元素不再参与下一轮的比较。
6. 冒泡排序的优缺点
6.1 优点
简单易懂:实现简单,适合初学者理解排序的基本原理。
稳定性:冒泡排序是稳定的排序算法,相同元素的相对顺序不会改变。
6.2 缺点
效率低下:对于大规模数据,冒泡排序效率较低,O(n²) 的时间复杂度使其在实际应用中不够高效。
交换频繁:在数据量较大时,频繁的交换操作会增加时间开销。
7. 适用场景
教育用途:适合用于教学和简单的演示。
小规模数据:在数据量较小的情况下,冒泡排序可以作为一种直观的排序方法。
总结
冒泡排序虽然在效率上并不占优势,但由于其实现简单、易于理解,依然是学习排序算法的一个重要组成部分。通过对冒泡排序的详细分析,可以更好地理解其原理、实现、复杂度及应用场景。

更多资源推荐:

http://sj.ysok.net/jydoraemon 提取码:JYAM
公众号【纪元A梦】



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

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

相关文章

【DA梦数据库系列】SQL注入小记

一、判断DMSQL二、基础语法2.1 注释2.2 常用运算符三、函数特性3.1 进制转换3.2 字符串截取3.3 字符串拼接3.4 其他四、SQLi 获取数据4.1 基本信息4.2 查询全局变量4.3 查询系统表4.4 查询视图五、联合查询注入六、报错注入6.1 除0错误6.2 溢出错误七、布尔盲注八、时间盲注九、…

ABC384E题通过历程

在赛时的时候,我们写出了一份非常牛逼的代码: # include <bits/stdc++.h> using namespace std; #define int long long const int N = 510; int a[N][N]; int vis[N][N]; struct node {bool operator()(int a, int b) {return a > b;} }; int dx[] = {0,1,-1,0}; i…

java学习12.16

springboot+vue3前后端分离的新技术的大部分写项目时的明显bug已经找到问题并纠正,可以赶上旧技术的进度了。再写几个项目就能在速度上超越旧的技术。

11CSS属性-颜色表示-chrome调试-浏览器渲染

一、今日内容 首先对这些属性进行一个演练 想要深刻理解所有常用的CSS属性,最好先学会以下几个最基础最常用的CSS属性font-size 文字大小 color前景色(文字颜色) background-color背景色 width宽度 height高度二、对CSS常用属性进行演练 1、字体的默认大小是16px的还可以看到…

使用win10 wsl子系统将 rust 程序静态编译为linux可执行文件

chapter Ⅰ 事情起因 最近在学习rust, 想把一部分java服务迁移至rust编写,但由于公司服务器都是linux系统,所以在找windows下交叉编译为linux可执行文件的方法,把bing首页搜索的结果试了个遍都不行, 始终报错“musl-gcc”无法找到,搜遍全网都无法解决。 最终在我不断尝试的…

Spring Cloud 负载均衡配置 (@LoadBalanced)

一、负载均衡 目前是两种 Ribbon 和 spring-cloud-loadbalancer - Ribbon已经闭源 配置策略较多 :轮询,随机,权重,自定义 四种负载均衡方案 配置方式yml 注解- spring-cloud-loadbalancer属于springcloud,项目兼容性更好 配置策略: 更注重 自定义(默认为轮询) 配置方式注…

架构信息收集

引子:一个Web应用的构成,由诸多组件&服务相结合,而域名仅是处于Web架构中最表层的一部分。本篇则由表及里,依次对整个Web应用架构,所需收集的信息类型、收集方式等进行介绍。附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.2 架构…

x86指令集 字节大小

x86指令集 字节大小 https://bbs.kanxue.com/thread-190127.htm 最近对x86_32架构下的许多程序进行了指令长度统计,结果表明所有程序所涉及的指令长度范围均为:1~11字节。而根据INTEL 开发者手册上介绍的指令的最大长度限制为15字节。但是,在什么情况或者架构上才会有12~15字…

实际项目中不一样的《桥接模式》

图片缩略图功能 需要对图片生产缩略图,压缩并保存到不同的介质中。输入端可能是本地图片,也可能是网络图片。保存的位置可能是本地,也有可能是第三方的minio、阿里云oss、七牛云oss。并且这些途径可能随时扩展。为了设计的灵活性,这里就要把输入可输出抽象出来,应用层通过…

一款渗透测试信息收集集成工具--mitan密探

本工具仅供安全测试人员运用于授权测试, 禁止用于未授权测试, 违者责任自负。作者及本公众号相关负责人不对您使用该工具所产生的任何后果负任何法律责任,在扫描模块使用多线程,在测试过程中根据目标的实际情况进行调整,切勿进行大线程低延时的大规模快速扫描,以免对目标服务…

最大网络流基本概念

1. 基本概念 1.1 流网络,不考虑反向边如果存在反向边也没事,不如有u->v和v->u两条边,那么就可以新加入一个点 p,u->v,v->p,p->u,转化为这三条边 1.2 可行流,不考虑反向边 1.2.1 两个条件:容量限制、流量守恒 容量限制:每条边流的不能超过这条边的权值 流量守…

sqli-labs

sqli-labs Less-1 基于错误的GET单引号字符型注入 index.php分析error_reporting(0); 不反馈错误 isset($_GET[id]) 检查($ _GET[id])参数是否设置 LIMIT 0,1 从第一条开始记录,只取一条记录1.推测闭合方式?id=1\输入\ ,后面是 ,推测是单引号闭合 输入 ?id=1 报错 输入 ?…