冒泡排序算法原理與Java實現

在編程中,排序是一項基礎且常見的任務。冒泡排序(Bubble Sort)是最簡單的排序算法之一,其核心思想是通過重複比較相鄰元素並交換位置,使較大的元素“冒泡”到數組末尾(升序排序時),或較小的元素“冒泡”到數組開頭(降序排序時)。

排序步驟解析

以數組 [5, 2, 9, 1, 5] 爲例,演示升序排序過程:

  1. 第一輪(未排序部分:[5,2,9,1,5]
    - 比較 525 > 2,交換 → [2,5,9,1,5]
    - 比較 595 < 9,不交換
    - 比較 919 > 1,交換 → [2,5,1,9,5]
    - 比較 959 > 5,交換 → [2,5,1,5,9]
    - 結果:最大元素 9 已“冒泡”到末尾,未排序部分變爲 [2,5,1,5]

  2. 第二輪(未排序部分:[2,5,1,5]
    - 比較 252 < 5,不交換
    - 比較 515 > 1,交換 → [2,1,5,5]
    - 比較 555 = 5,不交換
    - 結果:第二大元素 5 已“冒泡”到倒數第二位,未排序部分變爲 [2,1,5]

  3. 第三輪(未排序部分:[2,1,5]
    - 比較 212 > 1,交換 → [1,2,5]
    - 比較 252 < 5,不交換
    - 結果:第三大元素 5 已“冒泡”到倒數第三位,未排序部分變爲 [1,2]

  4. 第四輪(未排序部分:[1,2]
    - 比較 121 < 2,不交換
    - 結果:排序完成,數組變爲 [1,2,5,5,9]

Java代碼實現

public class BubbleSort {
    /**
     * 冒泡排序算法實現(升序)
     * @param arr 待排序的數組
     */
    public static void bubbleSort(int[] arr) {
        // 外層循環:控制排序輪數(最多n-1輪)
        for (int i = 0; i < arr.length - 1; i++) {
            boolean swapped = false; // 優化標記:本輪是否發生交換
            // 內層循環:控制每輪比較次數(已排好序的元素無需再比較)
            for (int j = 0; j < arr.length - 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 main(String[] args) {
        // 測試數組
        int[] arr = {5, 2, 9, 1, 5};
        System.out.println("排序前:" + java.util.Arrays.toString(arr));

        // 調用冒泡排序
        bubbleSort(arr);

        System.out.println("排序後:" + java.util.Arrays.toString(arr));
    }
}

代碼關鍵點說明

  1. 外層循環:控制排序輪數,共需 arr.length - 1 輪(最後一個元素無需比較)。
  2. 內層循環:每輪比較相鄰元素,次數爲 arr.length - 1 - ii 爲已排好序的元素個數)。
  3. 交換邏輯:使用臨時變量 temp 交換相鄰元素,確保排序穩定。
  4. 優化技巧:通過 swapped 標記,若某輪無交換,提前終止排序(適用於接近有序的數組)。

時間與空間複雜度

  • 時間複雜度
  • 最壞情況(完全逆序):O(n²)(需完整執行所有輪次)。
  • 平均情況:O(n²)
  • 最好情況(已排序):O(n)(優化後通過 swapped 標記提前終止)。
  • 空間複雜度O(1)(僅需臨時變量,原地排序)。

總結

冒泡排序原理簡單直觀,適合初學者理解排序核心思想。但由於時間複雜度較高(O(n²)),實際應用中較少用於大規模數據,通常用於教學或小規模數據排序場景。掌握後可進一步學習更高效的排序算法(如快速排序、歸併排序等)。

小夜