java学习--冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法,其核心思想是重复遍历待排序数组,每次比较相邻的两个元素,若顺序错误则交换它们的位置。因较小的元素会像 “气泡” 一样逐渐 “上浮” 到数组顶端,故得名 “冒泡排序”。
一、基本原理
- 遍历数组:从数组的第一个元素开始,依次比较相邻的两个元素(如第
i个和第i+1个)。 - 交换位置:若前一个元素大于后一个元素(升序排序),则交换它们的位置,确保较大的元素 “下沉” 到右侧。
- 重复过程:每完成一轮遍历,最大的元素会 “冒泡” 到数组的末尾(本轮的最后一个位置)。
- 减少范围:下一轮遍历只需处理剩余未排序的元素(排除已 “冒泡” 到末尾的元素),直到所有元素有序。
二、动图演示(升序排序)
以数组 [3, 1, 4, 2] 为例,冒泡排序过程如下:
第一轮:比较相邻元素,将最大的4移到末尾
[3,1,4,2] → [1,3,4,2](3和1交换)
→ [1,3,4,2] → [1,3,2,4](4和2交换)
结果:[1,3,2,4](4已就位)第二轮:处理前3个元素,将3移到倒数第二位
[1,3,2,4] → [1,3,2,4](1和3不交换)
→ [1,3,2,4] → [1,2,3,4](3和2交换)
结果:[1,2,3,4](3已就位)第三轮:处理前2个元素,已有序,无需交换
最终结果:[1,2,3,4]
三、Java 代码实现(升序排序)
public class BubbleSort {public static void bubbleSort(int[] arr) {if (arr == null || arr.length <= 1) {return; // 数组为空或只有一个元素,无需排序}int n = arr.length;// 外层循环:控制需要排序的轮数(n个元素需要n-1轮)for (int i = 0; i < n - 1; i++) {// 内层循环:每轮比较的范围(排除已排序的i个元素)// 每轮结束后,最大的i个元素已就位,故只需比较到n-1-ifor (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;}}}}public static void main(String[] args) {int[] arr = {3, 1, 4, 2, 5};System.out.println("排序前:" + Arrays.toString(arr));bubbleSort(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}
输出:
排序前:[3, 1, 4, 2, 5]
排序后:[1, 2, 3, 4, 5]
四、优化:减少无效遍历
上述基础实现中,若数组在中途已完全有序,仍会执行剩余的轮次,造成无效操作。可通过添加标志位优化:
- 若某一轮遍历中未发生任何交换,说明数组已完全有序,直接退出循环。
public static void optimizedBubbleSort(int[] arr) {if (arr == null || arr.length <= 1) {return;}int n = arr.length;boolean swapped; // 标志位:本轮是否发生交换for (int i = 0; i < n - 1; i++) {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; // 发生交换,标志位置为true}}// 若本轮未交换,说明数组已有序,直接退出if (!swapped) {break;}}
}
五、特点分析
| 特性 | 说明 |
|---|---|
| 时间复杂度 | - 最坏情况(完全逆序):O (n²)(需 n-1 轮,每轮 n-i 次比较)- 最好情况(已有序):O (n)(优化后仅需 1 轮遍历)- 平均情况:O (n²) |
| 空间复杂度 | O (1)(仅使用常数级额外空间,原地排序) |
| 稳定性 | 稳定(相等元素的相对位置不会改变,因仅当arr[j] > arr[j+1]时才交换) |
| 适用场景 | 小规模数据排序(简单易懂,但效率较低,不适合大规模数据) |
六、总结
冒泡排序是入门级排序算法,核心逻辑是相邻元素比较交换,通过 “下沉” 大元素实现排序。其优点是简单直观、稳定、原地排序,缺点是时间复杂度较高(O (n²)),仅适合处理少量数据。优化后的版本可通过标志位减少无效遍历,提升最佳情况下的效率。
