当前位置: 首页 > news >正文

冒泡排序 Java 实现 + 完整思路讲解

一、排序思路

冒泡排序核心思想:重复走访要排序的数列,依次比较相邻两个元素,如果顺序错误(前 > 后)就交换它们。 每一轮循环结束后,最大的元素会像气泡一样 “浮” 到数组末尾

流程拆解:

  1. 一共有n个元素,最多需要n-1轮比较;
  2. i轮排序后,末尾 i 个元素已经有序,不需要再比较
  3. 优化方案:设置标记,如果某一轮没有发生任何交换,说明数组已经有序,可以直接提前结束。

时间复杂度: 最坏 / 平均:\(O(n^2)\) 最好(优化后有序数组):\(O(n)\) 稳定排序(相等元素相对顺序不变)

二、基础版冒泡排序(无优化)

java

运行

public class BubbleSort { public static void main(String[] args) { int[] arr = {5, 3, 8, 4, 2, 7, 1, 6}; System.out.println("排序前:"); printArr(arr); bubbleSort(arr); System.out.println("排序后:"); printArr(arr); } /** * 基础冒泡排序 * @param arr 待排序数组 */ public static void bubbleSort(int[] arr) { // 数组长度 int n = arr.length; // 外层循环:控制一共进行多少轮,最多 n-1 轮 for (int i = 0; i < n - 1; i++) { // 内层循环:相邻比较 // 每一轮结束,最后 i 个元素已经排好,不需要遍历 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; } } } } // 打印数组工具方法 public static void printArr(int[] arr) { for (int num : arr) { System.out.print(num + " "); } System.out.println(); } }

三、优化版冒泡排序(重点推荐)

增加swap标记,数组提前有序时直接退出循环,减少无效遍历:

java

运行

public class BubbleSortOpt { public static void main(String[] args) { int[] arr = {2, 1, 3, 4, 5, 6, 7}; System.out.println("排序前:"); printArr(arr); bubbleSortOpt(arr); System.out.println("排序后:"); printArr(arr); } /** * 优化冒泡排序:有序提前终止 */ public static void bubbleSortOpt(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { // 标记本轮是否发生交换 boolean swapped = 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 printArr(int[] arr) { for (int num : arr) { System.out.print(num + " "); } System.out.println(); } }

四、简单举例推演(数组[5,3,2]

第一轮 (i=0) j=0:5>3 → 交换 → [3,5,2] j=1:5>2 → 交换 → [3,2,5] 最大数 5 沉到最后

第二轮 (i=1) j=0:3>2 → 交换 → [2,3,5] 次大数 3 就位

循环结束,排序完成。

http://www.jsqmd.com/news/1242363/

相关文章:

  • AI学术写作工具:从选题到格式的全流程优化
  • I2C控制器高级功能实战:中断、DMA与唤醒机制详解
  • TI C2000平台异步电机无传感器FOC增量式构建与调试实战
  • windows环境部署influx2.7 (时序数据库)
  • VS2022+QT 解决windeployqt工具打包发布运行缺少.DLL组件的问题 无法定位程序入口问题(打包海康程序无法定位程序入口)(程序运行管理员权限)
  • HugeGraph【部署】Linux单机部署
  • HarmonyOS应用开发实战:萌宠日记 - 周月年
  • QtScrcpy:5步实现Android设备跨平台实时投屏与控制终极指南
  • 三类照明项目避坑指南:从选型到落地的实操思路
  • TI Sitara GPMC时序配置:OE_RE与WE信号深度解析与工程实践
  • TI VPDMA中断配置实战:从寄存器解析到系统级调试
  • HDMI控制器寄存器详解:色彩空间转换与中断控制实战指南
  • 可复用项目脚手架应该包含什么
  • 深入解析TI Davinci VPDMA:客户端缓冲与中断机制实战指南
  • 管材上标注的DN,De,Φ,PN,SDR都有啥区别?配管道也太难了!
  • 从C6455到C6474:DSP多核启动、安全启动与电源管理迁移实战
  • 多接口联动实战:本地数据引擎如何构建完整量化分析体系
  • 分层消除不确定性(五·终)|完全脱离 LLM 的确定性判定 + 评测闭环
  • HarmonyOS应用开发实战:萌宠日记 - 三列统计数据展示
  • TI VPDMA中断寄存器深度解析与嵌入式视频处理驱动实战
  • Agent 变强,往往不是换模型,是换了 Harness
  • 冰雪传奇幻变三职业版手游官网下载:冰雪传奇幻变三职业最新官方下载渠道
  • TI CPSW以太网子系统寄存器配置实战:从原理到调优
  • Terraspace安全最佳实践:保护敏感数据与合规部署的5个关键策略
  • TI以太网ALE与CPGMAC_SL寄存器配置实战:从硬件转发原理到嵌入式网络优化
  • CAD自建图块库|标准件一键入库,反复调用超省心
  • 计算机毕业设计之专门体检预约管理系统
  • 北京华恒智信赋能纺织企业:薪酬与绩效考核挂钩改革案例
  • 嵌入式PMM电源管理:从寄存器配置到安全策略实战
  • ARM Cortex-R JTAG内存写入:从APB-AP接口到CPU指令注入的底层原理与实践