1. 程式人生 > 其它 >排序演算法2 - 氣泡排序

排序演算法2 - 氣泡排序

依次比較相鄰的元素,如果前一個元素比後一個元素大,則交換位置

排序演算法2 - 氣泡排序

演算法思路

依次比較相鄰的元素,如果前一個元素比後一個元素大,則交換位置

第一輪排序結束後,最後一個元素就會是最大的數

比較剩下的陣列元素(第 1 位到第 n - 2 位 ),方式同第一輪比較一樣

以此類推,直到所有元素均排序完畢

程式碼實現

public void bubbleSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i > 0; i--) { 
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    // 這種寫法比較抖機靈,不推薦,只是為做個介紹
    public void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

複雜度分析

時間複雜度為 O(N²) (第一次比較 n 個數,第二次比較 n-1 個數,第三次比較 n-2 個數... 呈等差數列分佈,所以複雜度為 an² + bn + c 的格式)

不佔用額外的記憶體空間

優化演算法

氣泡排序還有一種優化演算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對於提升效能來說並沒有什麼太大作用。

額外知識點: 元素交換

這裡的交換方法(swap) 和我們平常寫的不太一樣,看上去似乎很有逼格,這是通過異或運算實現的,具體實現原理見演算法之異或運算及其運用
歡迎大家來我部落格逛逛 mmimo技術小棧