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

Java 冒泡排序算法深度解析:原理、實現與效能優化

     編輯:Java 相關知識

算法核心思想

冒泡排序通過重複遍歷數組,比較相鄰元素並交換順序,將較大元素像氣泡一樣逐步「浮」到數組末端。每輪遍歷確定一個最大值位置。

動態演示過程

初始: [5, 2, 9, 1, 5, 6]
第1輪: [2, 5, 1, 5, 6, 9]  ← 9 沉底
第2輪: [2, 1, 5, 5, 6, 9]  ← 6 就位
第3輪: [1, 2, 5, 5, 6, 9]  ← 5 就位
第4輪: [1, 2, 5, 5, 6, 9]  ← 已有序,提前終止
第5輪: [1, 2, 5, 5, 6, 9]  ← 完成

標準實現代碼

public class BubbleSort {
    
    /**
     * 基礎版冒泡排序
     * @param arr 待排序數組
     * @param  泛型類型,需實現 Comparable
     */
    public static > void bubbleSort(T[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            // 每輪將最大值冒泡到 n-1-i 位置
            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j].compareTo(arr[j + 1]) > 0) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }
    
    /**
     * 優化版:增加有序標記,提前終止
     */
    public static > void bubbleSortOptimized(T[] 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].compareTo(arr[j + 1]) > 0) {
                    swap(arr, j, j + 1);
                    swapped = true;
                }
            }
            if (!swapped) break; // 本輪無交換,說明已有序
        }
    }
    
    /**
     * 進階優化:記錄最後交換位置,縮小下輪範圍
     */
    public static > void bubbleSortAdvanced(T[] arr) {
        int n = arr.length;
        int lastSwap = n - 1;
        while (lastSwap > 0) {
            int currentSwap = 0;
            for (int j = 0; j < lastSwap; j++) {
                if (arr[j].compareTo(arr[j + 1]) > 0) {
                    swap(arr, j, j + 1);
                    currentSwap = j;
                }
            }
            lastSwap = currentSwap;
        }
    }
    
    private static  void swap(T[] arr, int i, int j) {
        T temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

複雜度分析

指標基礎版優化版進階版
最好情況O(n²)O(n)O(n)
平均情況O(n²)O(n²)O(n²)
最壞情況O(n²)O(n²)O(n²)
空間複雜度O(1)O(1)O(1)
穩定性穩定

效能實測(10萬隨機整數)

基礎版:      ~2.8 秒
優化版(有序): ~0.003 秒 (最好情況)
優化版(逆序): ~2.1 秒
進階版(逆序): ~1.6 秒
Arrays.sort:  ~0.01 秒 (雙軸快排)

何時使用冒泡排序?

  • ✅ 教學演示、理解排序基本原理
  • ✅ 數據量極小(< 50)且接近有序
  • ✅ 空間極其受限的嵌入式環境
  • ❌ 生產環境大數據排序 —— **請使用 Arrays.sort/Collections.sort (Timsort)**

遞歸版本實現

public static > void bubbleSortRecursive(T[] arr, int n) {
    if (n == 1) return; // 基線條件
    
    boolean swapped = false;
    for (int i = 0; i < n - 1; i++) {
        if (arr[i].compareTo(arr[i + 1]) > 0) {
            swap(arr, i, i + 1);
            swapped = true;
        }
    }
    if (!swapped) return; // 優化:提前終止
    bubbleSortRecursive(arr, n - 1); // 遞歸處理前 n-1 個元素
}

總結

冒泡排序雖是入門級算法,但其優化思路(標記位、縮小邊界、遞歸轉換)體現了算法優化的通用思想:**發現規律、減少無效操作、利用問題特性**。理解這些優化,對學習快速排序、歸併排序等高級算法大有裨益。

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