让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算

简介: 冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。

⭐⭐⭐冒泡排序算法🌙🌙🌙:

  • 第一轮冒泡排序
    • 第一次拿数组的第1位和第2位进行比较,若第1位大于第2位,则将两者的值交换,
    • 再继续拿交换后的第1位与第3位进行比较,若第1位大于第3位,则将两者的值交换,
    • 然后再继续拿交换后的第1位与后续位进行比较,直到第1位与后续所有位置都比较完毕,最后会发现第一轮冒泡排序的最终结果是把最小值放到了第1位;
  • 第二轮冒泡排序:因为第一轮已经把最小值放到了第1位,则第二轮应该从第2位开始
    • 第一次拿数组的第2位和第3位进行比较,若第2位大于第3位,则将两者的值交换,
    • 再继续拿交换后的第2位与第4位进行比较,若第2位大于第4位,则将两者的值交换,
    • 然后再继续拿交换后的第2位与后续位进行比较,直到第2位与后续所有位置都比较完毕,最后会发现第二轮冒泡排序的最终结果是把次小值放到了第2位;
  • 后续轮次的排序思想跟前两轮类似,每次冒泡排序,都会把剩余位置里最小的那个值放到该次冒泡排序的起始位置,这样经过(数组长度-1)轮的冒泡后,就可以得到一个排好序的数组啦。
    冒泡排序时间复杂度
    • 假设数组的长度为n,从上述算法表述中可得,会经历(n-1)轮冒泡,而每一轮的冒泡里面其实又经历了(n-m)次的比值交换处理,m代表的是第几轮:
    • 正数第1轮,经历(n-1)次比值交换
    • 正数第2轮,经历(n-2)次比值交换
    • ...
    • 倒数第2轮,经历2次比值交换
    • 倒数第1轮,经历1次比值交换
    • 故,可得,总耗费步骤为:(n-1)+(n-2)+...2+1=[(1+(n-1))(n-1)]/2=(n(n-1))/2=(n²-n)/2=n²/2-n/2,根据时间复杂度计算原则,去掉常量,低阶项,再去掉高阶项的常量系数,得到时间复杂度为T(n)= =O(n²)。
    • 最优情况(O(n)):由于算法结构的限定,(n-1)轮的外层冒泡排序肯定是要进行的,而每一轮的冒泡排序里的比值交换则次数,在最优情况下,即数组已经排好序的情况下,里层的比值交换次数为0,即不需要交换。
    • 最坏情况(O(n²)):与要排序的顺序完全相反,即上述时间复杂度推导过程。
      • */
import java.util.Arrays;
public class BubbleSort {
   
    public static void main(String[] args) {
   
        int count = 0;
        int[] arr = {
   5,4,3,2,1};
        System.out.println("原始数组:" + Arrays.toString(arr));
        for(int i=0; i<arr.length-1; i++){
   
            System.out.println(i+1);
            for(int j=i+1;j<arr.length;j++){
   
                if(arr[i]>arr[j]){
   
                    int temp = arr[j];
                    arr[j]=arr[i];
                    arr[i]=temp;
                    System.out.println(Arrays.toString(arr) + (++count));
                }
            }
        }
    }    
}
目录
相关文章
|
8月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
254 3
|
4月前
|
Java
Java计算时间差
这段代码提供了两个方法来计算时间差。`timeDistance` 方法接收两个 `Date` 对象,计算并返回两者之间的天数、小时数和分钟数差异,格式为“X天Y小时Z分钟”。`hourDistance` 方法则接收两个时间字符串,解析后计算并返回两者之间相差的小时数(向上取整)。
143 4
|
6月前
|
存储 Java
java中的常见运算符的计算方式
本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。
128 6
java中的常见运算符的计算方式
|
6月前
|
存储 JavaScript Java
如何在Java中计算绝对值
绝对值表示一个数离0的距离,总是非负的。在Java中,可以通过`Math.abs()`函数或`if-else`条件语句来计算绝对值。使用`Math.abs()`可直接将负数转为正数,而`if-else`则根据条件判断是否取反。本文介绍了这两种方法的具体实现步骤和代码示例,并展示了如何通过用户输入获取数值并输出其绝对值。此外,还提供了完整的代码和编译执行的方法。
235 6
如何在Java中计算绝对值
|
7月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
278 2
|
7月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
7月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
117 0
|
搜索推荐 Java
冒泡排序-选择排序-插入排序-快速排序(java版实现)(下)
排序就是将输入的数字按照从小到大的顺序进行排列。由于排序是一个比较基础的问题,所以排序算法的种类也比较多。最近学习了几种常见的排序算法,下面介绍如何使用java代码实现对数组进行从下到大排序。
189 0
冒泡排序-选择排序-插入排序-快速排序(java版实现)(下)
|
Java
冒泡排序(Java实现)
冒泡排序(Java实现)
144 0
冒泡排序(Java实现)
|
Java 搜索推荐
冒泡排序之Java实现
      一、冒泡排序算法       1、 比较相邻的元素。如果第一个比第二个大,就交换他们两个。      2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
1009 0