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

Java冒泡排序算法之:变种版

什么是冒泡排序算法?

冒泡排序是一种简单的排序算法,通过多次遍历待排序的数组,逐步将最大的(或最小的)元素“冒泡”到数组的一端。它以其操作过程类似气泡从水底冒至水面而得名。


冒泡排序的工作原理

  1. 比较相邻元素: 从数组的第一个元素开始,逐个比较相邻的两个元素。如果前一个元素比后一个元素大(升序排序),则交换它们的位置。
  2. 将最大值(或最小值)移动到数组一端: 在每一轮遍历中,未排序部分的最大值(或最小值)会逐步移动到数组的末端。
  3. 重复以上步骤: 每次遍历的范围减小,直到整个数组有序。

代码实现

以下是冒泡排序的 Java 实现代码:

public class BubbleSort {public static void bubbleSort(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 main(String[] args) {int[] arr = {5, 2, 9, 1, 5, 6};System.out.println("排序前:");for (int num : arr) {System.out.print(num + " ");}System.out.println();bubbleSort(arr);System.out.println("排序后:");for (int num : arr) {System.out.print(num + " ");}}
}

示例运行结果

输入:
arr = {5, 2, 9, 1, 5, 6}

输出:
排序前:5 2 9 1 5 6
排序后:1 2 5 5 6 9


当然,基于传统的冒泡排序算法,我们还有其一种变种,简易代码实现如下:

public static void sort(int [] data){for (int j = 0;j < data.length-1;j++){int m = j;for (int k = j + 1;k < data.length;k++){if (data[k] < data[m]){m = k;}}int temp = data[m];int[m] = data[j];data[j] = temp;/*end of the loop*/}
}

可以说,传统冒泡是像一个大泡泡从底部向上冒一样,最终是由末尾的大数向小数排,而这种变种呢跟其恰好相反,是由开头的小数向大数排。 


冒泡排序的时间复杂度

  1. 时间复杂度:

    • 最好情况(数组已排序):O(n)O(n)O(n) (优化后)。
    • 最坏情况(数组逆序):O(n2)O(n^2)O(n2)。
    • 平均情况:O(n2)O(n^2)O(n2)。
  2. 空间复杂度:

    • O(1)O(1)O(1)(仅需常量级的额外空间)。

总结

冒泡排序虽然简单,但由于其效率较低,通常适用于小规模数据集或教学演示中。更高效的排序算法如快速排序或归并排序更适合实际应用场景。

 

 

 

 

 

 

http://www.lryc.cn/news/521965.html

相关文章:

  • AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%
  • Spring常见知识
  • 计算机网络的五层协议
  • Bluetooth LE Audio - 蓝牙无线音频新应用 (上)
  • 如何快速准备数学建模?
  • 如何在linux系统上完成定时开机和更新github端口的任务
  • Jupyter notebook中运行dos指令运行方法
  • 探索 Linux:(一)介绍Linux历史与Linux环境配置
  • 前端【2】html添加样式、CSS选择器
  • Yolov8 目标检测剪枝学习记录
  • LeDeCo:AI自动化排版、设计、美化海报
  • Flink CDC解决数据库同步,异常情况下增量、全量问题
  • 01、flink的原理和安装部署
  • 美图脱掉“复古外衣”,在AI浪潮中蜕变
  • sqlalchemy The transaction is active - has not been committed or rolled back.
  • 47.数据绑定的PropertyChanged C#例子 WPF例子
  • 网络安全 | Web安全常见漏洞和防护经验策略
  • Agent一键安装,快速上手Zabbix监控!
  • Edge Scdn是什么,它如何提升网站安全性与访问速度?
  • ubuntu20.04 docker安装
  • 初始C#.
  • js高亮文本
  • 解决SpringBoot 健康检测接口 actuator/health 访问一直卡着,但 actuator/info等其他接口能正常访问的问题
  • KVM创建ubuntu20.04虚机,部署K8S,再克隆出二份,做为Worker节点加入集群,通过Helm创建2个Pod,让它们之间通过域名互访
  • GaussDB中的Vacuum和Analyze
  • IvorySQL 4.2 发布
  • 浅谈云计算20 | OpenStack管理模块(下)
  • 去年社融增量超32万亿 货币信贷平稳增长-乐享数科
  • STM32 HAL库函数入门指南:从原理到实践
  • React封装倒计时按钮