冒泡排序屬於交換排序:兩兩比較相鄰元素,順序錯誤即交換,直到無逆序為止。將陣列視為垂直排列的氣泡,較輕(數值較小)的氣泡向上「飄浮」,每趟掃描將當前無序區最小元素移至有序區頂端。
對序列 49 38 65 97 76 13 27 49 排序:
void BubbleSort(SeqList R) {
int i, j;
boolean exchange;
for (i = 1; i < n; i++) {
exchange = false;
for (j = n-1; j >= i; j--)
if (R[j+1].key < R[j].key) {
swap(R, j+1, j);
exchange = true;
}
if (!exchange) return; // 本趟無交換,提前結束
}
}
| 情況 | 比較次數 | 移動次數 | 時間複雜度 |
|---|---|---|---|
| 最好(已有序) | n-1 | 0 | O(n) |
| 最壞(逆序) | n(n-1)/2 | 3n(n-1)/2 | O(n²) |
| 平均 | - | - | O(n²) |
屬於就地排序,且穩定(相等元素相對位置不變)。
下一趟只需掃描到 lastExchange,可一次擴充多個有序元素,減少趟數。
交替「向上飄浮」與「向下沉降」,解決「最重氣泡在頂端需 n-1 趟」的不對稱問題。
public class BubbleSort implements SortStrategy {
public void sort(Comparable[] obj) {
if (obj == null) throw new NullPointerException("The argument can not be null!");
Comparable tmp;
for (int i = 0; i < obj.length; i++)
for (int j = 0; j < obj.length - i - 1; j++)
if (obj[j].compareTo(obj[j+1]) > 0) {
tmp = obj[j];
obj[j] = obj[j+1];
obj[j+1] = tmp;
}
}
}
此版本使用正向掃描(大值後移),邏輯與教科書反向掃描等價,適用於任何實作 Comparable 的物件陣列。