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

数据结构学习笔记:冒泡排序(Java)

1.原始版本

算法思想

对于待排序列,从左到右依次将相邻元素两两比较,将更大的元素交换到右边。每遍历一次后,待排序列中的最大元素将被移动到最右侧,进入已排序列。同时还有若干个较大的元素被向右移动了数次。不断重复,待排序列逐渐缩小直至排列完毕。

当然,也可以在遍历中将更小元素向左冒泡。从算法上二者效率一致,但由于CPU特性,正序读取数组的效率更高。

以下是一次循环的图示:

代码

public static void bubbleSort(int[] array) { // maxIndex为待排序列的右边界 for (int maxIndex = array.length - 1; maxIndex > 0; maxIndex--) { for (int i = 0; i < maxIndex; i++) { if (array[i] > array[i + 1]) { swap(array, i , i + 1); } } } } private static void swap(int[] array, int a, int b) { int temp = array[a]; array[a] = array[b]; array[b] = temp; }

2. 优化1

优化思想

对于长度为n的序列,原方法必然要进行n-1次遍历。若在某次遍历的过程中,没有出现交换操作,说明整个序列已经排好了,不必进行后续的循环了。

可以设置flag作为标记提高效率。

代码

public static void bubbleSort2(int[] array) { boolean flag = true; // flag为true表示还未排好 for (int maxIndex = array.length - 1; maxIndex > 0 && flag; maxIndex--) { flag = false; for (int i = 0; i < maxIndex; i++) { if (array[i] > array[i + 1]) { flag = true; // 发生交换,说明可能还未排好,设置flag为true swap(array, i , i + 1); } } } }

3. 优化2

优化思想

若当前的待排序列右侧若干个元素已经是排好的,那么在一次遍历中这些元素不会被交换,下次遍历可以跳过这些元素,遍历更小的区间。下次遍历的右边界为本次遍历最后一次发生交换的位置。

代码

public static void bubbleSort3(int[] array) { int newIndex; // 用于记录下次遍历的右边界 int maxIndex = array.length - 1; // 待排序列的右边界 do { newIndex = 0; for (int i = 0; i < maxIndex; i++) { if (array[i] > array[i + 1]) { newIndex = i; // 下次遍历的区间可能为[0, i] swap(array, i, i + 1); } } maxIndex = newIndex + 1; // 由于循环条件为i<maxIndex,所以要加1 } while (newIndex > 0); // newIndex==0说明没有交换,排序完成 }

PS:遍历后newIndex为0说明没有交换,结束循环,即优化1的思想

4. 时间复杂度

  • 最好情形:

    原始数组已排好,共需要经过n-1次比较,时间复杂度为O(n)

  • 最坏情形:

    原始数组倒序排序,第i次循环要经历n-i次比较,n-i次交换,次数均为

    时间复杂度为

http://www.cnnetsun.cn/news/1329323.html

相关文章:

  • Qwen Pixel Art应用场景:复古电子贺卡、像素化社交媒体Banner动态生成
  • 从存储配置到中文界面:Proxmox VE新手上路全攻略(含ZFS池创建技巧)
  • 联想小新BIOS更新导致PIN失效?手把手教你安全完成系统更新
  • 3-RRR 并联机构奇异位形解析与优化设计
  • 基于LLM(大模型)AI 翻译软件 - 技术架构与功能说明
  • SeaweedFS单机多节点部署实战:从下载到挂载的完整流程(含日志配置)
  • 【蒸汽教育求职分享】美国SDE求职通关秘籍:从技术硬实力到沟通软功夫全解析
  • Phi-3 Forest Laboratory C语言编程辅导:从语法纠错到数据结构实现
  • Qwen3模型训练轮数(epochs)优化指南:从理论到实践
  • Sonic数字人解决音画不同步:参数设置保姆级指南
  • WSL2 SSH配置避坑指南:从systemd启用到防火墙设置全流程
  • 企业微信 RPA 自动化:低代码连接业务与私域
  • 8. TI MSPM0G3507定时器实战:1秒LED闪烁实验详解
  • Qwen3-14b_int4_awq企业应用探索:多轮对话、长文本生成、代码辅助实战案例
  • Qwen3-VL-8B升级攻略:从基础部署到高级功能,一步步成为多模态高手
  • 基于STM32 HAL库的4.3寸电容触摸屏LCD驱动移植与优化实战
  • QMC音频解密工具:从数字牢笼到自由播放的技术突破
  • BLDC电机控制避坑指南:从霍尔信号处理到PWM调制的5个常见问题
  • iOS H5底部悬浮按钮被遮挡?3分钟搞定安全区适配(附完整代码)
  • APK安全测试实战:Burp Suite联动逍遥模拟器抓包与证书信任全攻略
  • Flutter GetX实战:如何用状态管理+路由搞定电商App购物车功能?
  • 5步激活旧Mac潜力:OpenCore Legacy Patcher全攻略
  • 从云端到设备端:基于阿里云物联网平台与MQTT协议的OTA升级全链路解析
  • OpenCore Legacy Patcher:让老Mac重获新生的macOS兼容性工具
  • Realistic Vision V5.1效果实测:手部/脸部崩坏率降低82%的写实优化方案
  • 开漏输出与上拉电阻:I2C总线双向通信与冲突仲裁的硬件基石
  • 衡山派D13x方案XSPI模块详解:OPI/SPI总线协议与PSRAM高速通信实战
  • Qwen3-14b_int4_awq保姆级教程:基于vLLM的GPU高效部署与Chainlit前端调用
  • 用Python玩转币安API:5分钟搭建加密货币实时价格监控工具(附完整代码)
  • Claude Code开发体验对比:在Phi-3-vision平台上实现类似智能编程助手