氣泡排序是最基礎的排序演算法之一,透過相鄰元素比較交換,將最大值逐步「浮」至陣列末端。
package com.robert.paixu;
public class BubbleSortAlgorithm {
public static void main(String[] args) {
int[] arrays = {1, 9, 2, 8, 3, 7, 4, 5, 0, 10, 18, 11};
bubbleSort(arrays);
display(arrays);
}
private static void bubbleSort(int[] arrays) {
int temp = 0;
for (int i = 0; i < arrays.length - 1; i++) {
for (int j = 0; j < arrays.length - i - 1; j++) {
if (arrays[j] > arrays[j + 1]) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
}
}
}
}
private static void display(int[] arrays) {
for (int val : arrays)
System.out.print(val + " ");
}
}
初始: [1, 9, 2, 8, 3, 7, 4, 5, 0, 10, 18, 11] 第1輪: [1, 2, 8, 3, 7, 4, 5, 0, 9, 10, 11, 18] ← 18 浮至最右 第2輪: [1, 2, 3, 7, 4, 5, 0, 8, 9, 10, 11, 18] ← 11 就位 ... 最終: [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 18]
| 情況 | 時間複雜度 | 說明 |
|---|---|---|
| 最佳 | O(n²) | 即使已排序仍需完整比較 |
| 平均 | O(n²) | |
| 最差 | O(n²) | 逆序陣列 |
| 空間 | O(1) | 原地排序 |
private static void bubbleSortOptimized(int[] arrays) {
boolean swapped;
for (int i = 0; i < arrays.length - 1; i++) {
swapped = false;
for (int j = 0; j < arrays.length - i - 1; j++) {
if (arrays[j] > arrays[j + 1]) {
swap(arrays, j, j + 1);
swapped = true;
}
}
if (!swapped) break; // 本輪無交換,已有序
}
}
優化後最佳情況(已排序)時間複雜度降為 O(n)。
雖實務價值有限,但氣泡排序是理解以下概念的絕佳入門: