首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

冒泡排序原理與 Java 實作完整指南

     編輯:Java 相關知識

演算法核心思想

重複遍歷陣列,比較相鄰元素,順序錯誤則交換。每輪將最大元素「沉」到末端(或最小元素「浮」到前端),故名冒泡排序。

步驟圖解

陣列 [3, 5, 2, 6, 2]:

  1. 第 1 輪:3↔5(不換) → 5↔2(換) → 5↔6(不換) → 6↔2(換) → [3, 2, 5, 2, 6] (6 就位)
  2. 第 2 輪:3↔2(換) → 3↔5(不換) → 5↔2(換) → [2, 3, 2, 5, 6] (5 就位)
  3. 第 3 輪:2↔3(不換) → 3↔2(換) → [2, 2, 3, 5, 6] (3 就位)
  4. 第 4 輪:2↔2(不換) → [2, 2, 3, 5, 6] (完成)

Java 實作(含過程輸出)

public class BubbleSort {
    public static int[] sort(int[] array) {
        if (array == null || array.length <= 1) return array;

        for (int i = 0; i < array.length - 1; i++) {
            System.out.println("第 " + (i+1) + " 輪開始");
            boolean swapped = false;

            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j+1] < array[j]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    swapped = true;
                }
                System.out.println("  第 " + (j+1) + " 次比較: " + Arrays.toString(array));
            }

            System.out.println("  結果: " + Arrays.toString(array));
            if (!swapped) break; // 優化:提前結束
        }
        return array;
    }

    public static void main(String[] args) {
        int[] data = {3, 5, 2, 6, 2};
        System.out.println("原始: " + Arrays.toString(data));
        sort(data);
        System.out.println("最終: " + Arrays.toString(data));
    }
}

執行輸出


原始: [3, 5, 2, 6, 2]
第 1 輪開始
  第 1 次比較: [3, 5, 2, 6, 2]
  第 2 次比較: [3, 2, 5, 6, 2]
  第 3 次比較: [3, 2, 5, 6, 2]
  第 4 次比較: [3, 2, 5, 2, 6]
  結果: [3, 2, 5, 2, 6]
第 2 輪開始
  第 1 次比較: [2, 3, 5, 2, 6]
  第 2 次比較: [2, 3, 5, 2, 6]
  第 3 次比較: [2, 3, 2, 5, 6]
  結果: [2, 3, 2, 5, 6]
第 3 輪開始
  第 1 次比較: [2, 3, 2, 5, 6]
  第 2 次比較: [2, 2, 3, 5, 6]
  結果: [2, 2, 3, 5, 6]
第 4 輪開始
  第 1 次比較: [2, 2, 3, 5, 6]
  結果: [2, 2, 3, 5, 6]
最終: [2, 2, 3, 5, 6]

複雜度與特性

指標數值
時間複雜度(最好)O(n) — 已排序陣列,單輪無交換即結束
時間複雜度(平均/最差)O(n²)
空間複雜度O(1) — 原地排序
穩定性穩定 — 相等元素不交換

優化策略

  1. 提前結束旗標:某輪無交換 → 已有序 → break
  2. 雞尾酒排序:雙向冒泡,減少「烏龜」(小元素在後端)移動輪數
  3. 記錄最後交換位置:下一輪只需遍歷到最後交換位置

適用場景與避坑

  • ✅ 教學示範、極小陣列(< 50)、近乎有序資料
  • ❌ 大量資料、即時系統、效能敏感場景
  • ⚠️ 面試常考:手寫冒泡、優化版、穩定性證明、與選擇/插入排序比較

結語

冒泡排序雖非實務首選,但其「相鄰比較交換、輪次遞減、提前結束」的思維模式是理解更複雜排序演算法的基石。掌握雙重迴圈邊界條件、穩定性分析與優化技巧,能夠在面試與教學場合游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved