一、定义
通过相邻元素的比较与交换,将较大的元素逐步「冒泡」到数组末尾,较小的元素自然「下沉」到数组开头。
二、算法步骤
步骤1:比较相邻元素
从数组的第一个元素开始,比较当前元素和下一个元素。
步骤2:交换元素
如果当前元素大于下一个元素(升序排序),交换它们的位置。
步骤3:移动指针
向后移动一个位置,继续比较下一对相邻元素。
步骤4:完成一轮
重复步骤1-3,直到达到数组末尾。此时最大的元素已经在正确位置。
步骤5:重复
对剩下的未排序元素重复上述过程,直到整个数组有序。

三、代码实现
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
System.out.println("排序前: " + Arrays.toString(arr));
bubbleSort(arr);
System.out.println("排序后: " + Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
int n = arr.length;
// 外层循环控制轮数
for (int i = 0; i < n - 1; i++) {
// 内层循环进行相邻元素比较和交换
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;
}
}
// 打印每轮排序结果
System.out.println("第" + (i + 1) + "轮: " + Arrays.toString(arr));
}
}
}
四、算法分析
| 指标 | 复杂度 | 说明 |
|---|---|---|
| 最佳时间复杂度 | O(n) | 数组已有序,只需一趟遍历 |
| 最坏时间复杂度 | O(n2) | 数组逆序,需要 n 趟遍历 |
| 平均时间复杂度 | O(n2) | 一般情况下的复杂度 |
| 空间复杂度 | O(1) | 原地排序,只使用常数空间 |
| 稳定性 | 稳定 | 相等元素相对位置不变 |
五、算法特点
优点:
-
简单易懂:逻辑清晰,容易实现
-
稳定排序:相等元素的相对位置不变
-
原地排序:不需要额外空间
-
适应性:对已部分有序的数组效率高
缺点:
-
效率低:O(n²)的时间复杂度
-
不适合大数据:数据量大时性能差
-
多次交换:每轮可能需要多次交换操作