Sterblich的个人博客

冒泡排序(Bubble Sort)详解:从原理到Java实现

冒泡排序(Bubble Sort)详解:从原理到Java实现

1. 什么是冒泡排序

冒泡排序是一种最基础的交换排序算法。主要用于小规模数据排序、教学演示,以及在数据基本有序的场景下进行快速修正。

2. 核心思想

重复遍历待排序的序列,依次比较相邻的两个元素,如果它们的顺序错误(比如前大后小)就交换过来。每一次完整的遍历,都会让当前未排序部分中最大的那个元素像"气泡"一样,逐渐"浮"到序列的最末端。

3. 算法执行过程

重复遍历数组,依次比较相邻元素,把大的往后交换,每轮确定一个最大数放到末尾,直到全部排好。

4. 流程图

5. Java 实现

public int[] bubbleSort(int[] array){
        if(array==null||array.length<2){
            return array;
        }
        //1.外层循环
        for (int i = 0; i < array.length-1; i++) {
            //2.内层循环
            for (int j = 1; j < array.length-i; j++) {
                if(array[j]<array[j-1]){
                    int temp=array[j];
                    array[j]=array[j-1];
                    array[j-1]=temp;
                }
            }
        }
        return array;
    }

6. 代码逐段解析

6.1外层循环功能

决定总共需要进行多少轮"冒泡"。

6.2内层循环功能

在每一轮中,从左到右扫描未排序部分,完成相邻元素的比较和交换。

7. 复杂度分析

冒泡排序的复杂度分析

冒泡排序是一种基于比较和交换的排序算法。它的核心操作是比较相邻元素并在逆序时进行交换。假设:

  • n:数组中元素的个数


时间复杂度:O(n²)

1. 比较次数

冒泡排序通过两层循环完成排序:

  • 外层循环:执行 n-1 轮

  • 内层循环:第 i 轮需要比较 n-1-i 次

总的比较次数为:

text

(n-1) + (n-2) + (n-3) + ... + 2 + 1 = n(n-1)/2

所以比较次数为:O(n²)

时间复杂度:O(1)

冒泡排序是原地排序算法:

  • 只使用了常数级别的额外空间

  • 只需要一个临时变量 temp 用于交换元素

text

额外空间 = 1 个临时变量(常数级)

因此空间复杂度为:O(1)

8. 优缺点及应用

优点

冒泡排序实现非常简单,代码只有几行,不容易写错。它是稳定排序,相等元素顺序不变,适合多字段排序。空间复杂度是O(1),只需要一个临时变量,几乎不占额外内存。加上优化标志后,数据基本有序时效率很高,最快可达O(n)。还能用来检测数组是否有序,一趟扫描没交换就说明已经排好了。代码简单也意味着调试方便,出问题很容易定位。

缺点

冒泡排序平均效率太低,时间复杂度是O(n²),数据量稍大性能就急剧下降。最坏情况下比较和交换次数都达到最大,运行非常慢。十万个数据需要约五十亿次比较,实践中完全不可接受。每发现一个逆序对就要交换一次,数据移动开销也大。忘记加优化标志效率会更差。在所有常见排序算法中,冒泡排序的综合性能是最差的之一。

应用场景

冒泡排序最常用于教学,适合初学者理解排序的基本概念。实际开发中主要用于数据量很小的场景,比如元素少于五十个,简单比效率更重要。数据基本有序时,配合优化标志只要几轮就能完成。在嵌入式系统等资源受限环境中,它不占内存、不需要递归,比较可靠。单向链表上排序时,冒泡比快排实现更方便。还可以用来检测数组是否有序,或者只找出最大的几个数。

9. 总结

冒泡排序通过相邻元素比较交换,让最大值逐轮"浮"到末尾,n个元素需n-1轮。平均时间复杂度O(n²),空间O(1),稳定排序。优点是简单省内存,缺点是效率低。主要用于教学、小数据量(n<50)和资源受限场景,大数据请用快速排序。简单但不够快,适合入门学习。

推荐阅读

作者