冒泡排序是最經典的入門排序算法,名稱由來:較大的元素像氣泡一樣通過交換逐漸「浮」到數列末端。雖然效率較低,但邏輯清晰,是教學首選。
n-1 輪,每輪比較次數遞減| 輪次 | 比較過程 | 輪次結果 | 說明 |
|---|---|---|---|
| 1 | 3↔2, 3-4, 4↔1 | 2 3 1 4 | 最大值 4 到達末尾 |
| 2 | 2-3, 3↔1 | 2 1 3 4 | 次大值 3 到達倒數第二 |
| 3 | 2↔1 | 1 2 3 4 | 完成排序 |
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 8
// 標準冒泡排序:固定執行 n-1 輪
void bubbleSort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
// 優化版:若某輪無交換,說明已有序,提前結束
void bubbleSortBetter(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
bool isSorted = true;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
isSorted = false;
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
if (isSorted) break; // 提前退出
}
}
int main() {
int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
// bubbleSort(num, N); // 標準版
bubbleSortBetter(num, N); // 優化版
printf("排序結果:\n");
for (int i = 0; i < N; i++) printf("%d ", num[i]);
printf("\n");
return 0;
}
排序結果:11 19 25 38 44 78 89 96
| 特性 | 標準版 | 優化版 |
|---|---|---|
| 最好時間複雜度 | O(n²) | O(n)(已有序) |
| 平均/最壞時間複雜度 | O(n²) | O(n²) |
| 空間複雜度 | O(1) | O(1) |
| 穩定性 | 穩定 | 穩定 |
雙向冒泡:奇數輪從左向右冒泡最大值,偶數輪從右向左冒泡最小值,可進一步減少遍歷次數,適合「小數據在右端、大數據在左端」的數據分佈。