排序演算法2 - 氣泡排序
阿新 • • 發佈:2021-10-09
依次比較相鄰的元素,如果前一個元素比後一個元素大,則交換位置
排序演算法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技術小棧