java - 冒泡排序

news/2024/7/24 2:18:20 标签: java, 算法, 开发语言

一、什么是冒泡排序

冒泡排序(Bubble sort)是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐渐交换到序列的一端,从而达到排序的目的。

具体步骤如下:

  1. 从序列的第一个元素开始,依次比较相邻的两个元素。
  2. 如果它们的顺序不正确(比如当前元素大于下一个元素),则进行交换,将较大的元素向序列的末尾移动。
  3. 继续向后遍历序列,重复进行相邻元素的比较和交换操作,直到完成一轮遍历。
  4. 重复上述步骤,直到序列排序完成,即没有发生任何元素交换的情况。

冒泡排序的一轮遍历会使至少一个元素移动到正确的位置,经过n-1轮的遍历(n为序列长度),即可完成排序。冒泡排序的时间复杂度为O(n^2)。

冒泡排序虽然简单易懂,但对于大规模的数据排序效率较低,不适用于处理大量数据的情况。然而,对于小规模的数据或者部分有序的序列,冒泡排序仍有一定的实际应用价值。

二、代码实现

注意:本代码已效率优化,经过优化,冒泡排序的最差平均时间复杂度仍为 O(n^2);但当输入数组完全有序时,可达到最佳时间复杂度 O(n)。

java">
    public static void BubbleSort(int[] nums){
        int size = nums.length;
        // 外循环:未排序区间为 [0, i]
        for(int i = size - 1 ; i > 0 ; i--){
             // 记录交换元素
             boolean flag = false;
            // 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
            for(int j = 0 ; j < i ; j++){
                if(nums[j] > nums[j+1]){
                    // 记录交换元素
                    flag = true;
                    // 交换 nums[j] 与 nums[j + 1]
                    int tmp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = tmp;
                }
            }
            if (flag == false){
                // 此轮冒泡未交换任何元素,直接跳出
                return ;
            }
        }
    }

三、算法特性

时间复杂度: O(n^2),各轮冒泡遍历的数组长度依次为 n−1、n−2、…、2、1 ,总和为 (n−1)n/2 。在引入flag优化后,最佳时间复杂度可达到 O(n) 。

空间复杂度:O(1)。

稳定排序:由于冒泡排序遇到相等的元素不交换,因此是稳定排序。


http://www.niftyadmin.cn/n/5225688.html

相关文章

【广州华锐视点】3D宪法普法知识宣传展厅——线上法律知识学习新途径

随着科技的不断发展&#xff0c;人们的生活方式也在不断地改变。在这个信息爆炸的时代&#xff0c;传统的普法教育方式已经无法满足人们的需求。为了适应这一变化&#xff0c;越来越多的教育机构开始尝试利用现代科技手段进行普法教育。其中&#xff0c;3D宪法普法知识宣传展厅…

LeetCode:907. 子数组的最小值之和(单调栈 C++ 、Java)

目录 907. 子数组的最小值之和 题目描述&#xff1a; 实现代码与解析&#xff1a; 单调栈 原理思路&#xff1a; 907. 子数组的最小值之和 题目描述&#xff1a; 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;…

二叉树(判断是否为对称二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 观察题目&#xff0c;只需判断该二叉树是否对称。 判断二叉树是否对称&#xff0c;就可以换位去判断该二叉树的左子树和右子树是否对称。 这时就可以写一个辅助函数来方便判断。 该函数是判断两颗树是否镜像对称&#xff0c;这…

L1-004:计算摄氏温度

题目描述 给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式&#xff1a;输入在一行中给出一个华氏温度。 输出格式&#xff1a;在一行中按照格式“Celsius C”…

java8 lambda常用整理(1)

1.map遍历 可以使用Map接口提供的新方法forEach来遍历Map的键值对。这个方法接受一个BiConsumer函数式接口作为参数&#xff0c;该接口定义了一个操作&#xff0c;接收键和对应的值作为输入。 下面是一个示例代码&#xff0c;展示如何在Java 8中使用forEach方法遍历Map&#…

软件测试之bug分析定位技巧

1、web前端 Web前端就是通常说的网页。互联网公司的前端一般包含如下内容&#xff1a;JavaScript、ActionScript、CSS、HTML(..ML)、Flash、交互式设计、视觉设计 web前端测试可能发现的问题——版面设计、交互设计、文字、性能、功能 bug定位通用思路&#xff1a;现象-->…

抖音本地生活服务商申请要多久审核通过?

近年来&#xff0c;随着互联网的普及和社交媒体的兴起&#xff0c;本地生活服务行业也迎来了巨大的发展机遇。作为最受欢迎的短视频平台之一&#xff0c;抖音也不例外。抖音本地生活服务商申请要多久审核通过&#xff1f;这是许多想要加入抖音本地服务行业的人们最关心的问题之…

【MYSQL】表的基本查询

目录 前言 一、Create&#xff08;增&#xff09; 1.单行数据 全列插入 2.多行数据 指定列插入 3.插入否则更新 4.替换 二、Retrieve&#xff08;查&#xff09; 1.select列 1.1全列查询 1.2指定列查询 1.3查询字段为表达式 1.4为查询结果指定别名 1.5结果去重 …