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

Java 雙向冒泡排序算法原理與代碼實現

     編輯:Java 相關知識

算法原理

雙向冒泡排序(Cocktail Shaker Sort)在每一輪中:

  1. 正向遍歷將最大元素「冒泡」到右端。
  2. 反向遍歷將最小元素「沉底」到左端。
  3. 縮小無序區範圍,直到有序或左右指針相遇。

相比單向冒泡,雙向版本每輪確定兩端元素,減少約一半的外層循環次數。

完整 Java 實現

public class BiBubbleSort {
    public int[] sort(int[] a) {
        int left = 0;
        int right = a.length - 1;
        while (left < right) {
            boolean swapped = false;
            // 正向:最大值移到 right
            for (int i = left; i < right; i++) {
                if (a[i] > a[i + 1]) {
                    swap(a, i, i + 1);
                    swapped = true;
                }
            }
            right--;
            if (!swapped) break;
            swapped = false;
            // 反向:最小值移到 left
            for (int i = right; i > left; i--) {
                if (a[i] < a[i - 1]) {
                    swap(a, i, i - 1);
                    swapped = true;
                }
            }
            left++;
            if (!swapped) break;
        }
        return a;
    }
    private void swap(int[] a, int i, int j) {
        int t = a[i]; a[i] = a[j]; a[j] = t;
    }
}

優化點

  • swapped 標誌:若某方向無交換,說明已有序,提前終止。
  • 雙指針 left/right 逐步收縮,避免重複比較已排序區域。

複雜度分析

測試代碼

public static void main(String[] args) {
    int[] data = {5, 1, 4, 2, 8, 3, 9, 7, 6, 0};
    System.out.println("排序前: " + Arrays.toString(data));
    new BiBubbleSort().sort(data);
    System.out.println("排序後: " + Arrays.toString(data));
}
// 輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指標複雜度
時間複雜度(最好)O(n) — 已有序數組
時間複雜度(平均/最壞)O(n²)
空間複雜度O(1) — 原地排序
穩定性穩定