冒泡排序 Java 实现 + 完整思路讲解

一、排序思路

冒泡排序核心思想:重复走访要排序的数列,依次比较相邻两个元素,如果顺序错误(前 > 后)就交换它们。 每一轮循环结束后,最大的元素会像气泡一样 “浮” 到数组末尾

流程拆解:

  1. 一共有n个元素,最多需要n-1轮比较;
  2. i轮排序后,末尾 i 个元素已经有序,不需要再比较
  3. 优化方案:设置标记,如果某一轮没有发生任何交换,说明数组已经有序,可以直接提前结束。

时间复杂度: 最坏 / 平均:\(O(n^2)\) 最好(优化后有序数组):\(O(n)\) 稳定排序(相等元素相对顺序不变)

二、基础版冒泡排序(无优化)

java

运行

public class BubbleSort { public static void main(String[] args) { int[] arr = {5, 3, 8, 4, 2, 7, 1, 6}; System.out.println("排序前:"); printArr(arr); bubbleSort(arr); System.out.println("排序后:"); printArr(arr); } /** * 基础冒泡排序 * @param arr 待排序数组 */ public static void bubbleSort(int[] arr) { // 数组长度 int n = arr.length; // 外层循环:控制一共进行多少轮,最多 n-1 轮 for (int i = 0; i < n - 1; i++) { // 内层循环:相邻比较 // 每一轮结束,最后 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; } } } } // 打印数组工具方法 public static void printArr(int[] arr) { for (int num : arr) { System.out.print(num + " "); } System.out.println(); } }

三、优化版冒泡排序(重点推荐)

增加swap标记,数组提前有序时直接退出循环,减少无效遍历:

java

运行

public class BubbleSortOpt { public static void main(String[] args) { int[] arr = {2, 1, 3, 4, 5, 6, 7}; System.out.println("排序前:"); printArr(arr); bubbleSortOpt(arr); System.out.println("排序后:"); printArr(arr); } /** * 优化冒泡排序:有序提前终止 */ public static void bubbleSortOpt(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { // 标记本轮是否发生交换 boolean 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; } } // 如果本轮一次交换都没有,数组已有序,直接跳出 if (!swapped) { break; } } } public static void printArr(int[] arr) { for (int num : arr) { System.out.print(num + " "); } System.out.println(); } }

四、简单举例推演(数组[5,3,2]

第一轮 (i=0) j=0:5>3 → 交换 → [3,5,2] j=1:5>2 → 交换 → [3,2,5] 最大数 5 沉到最后

第二轮 (i=1) j=0:3>2 → 交换 → [2,3,5] 次大数 3 就位

循环结束,排序完成。