冒泡排序是最基礎的排序算法之一,雖然平均/最壞時間複雜度為 O(n²),但其思路直觀、代碼簡潔,適合教學與小規模數據排序。本文通過圖解演示排序過程,給出生產級優化代碼(含提前終止標誌),並分析算法特性。
將數組視為垂直排列,每趟從底部向上比較相鄰元素,**逆序則交換**。每趟結束時,最小元素像氣泡一樣「浮」到當前未排序區域的最頂端。共需 n-1 趟,依次將最小、次小、第三小……元素移至第 0、1、2……位置。
初態: 38 20 46 38 74 91 12 25
第1趟: 12 38 20 46 38 74 91 25 ← 12 浮到頂端
第2趟: 12 20 38 25 46 38 74 91 ← 20 就位
第3趟: 12 20 25 38 38 46 74 91 ← 25 就位
第4趟: 12 20 25 38 38 46 74 91 ← 無交換,提前結束
#include <stdio.h>
#include <stdbool.h>
/* 冒泡排序:升序排列 r[0..n-1] */
void bubble_sort(int r[], int n) {
int i, j, temp;
bool swapped; // 標誌本趟是否發生交換
for (i = 0; i < n - 1; ++i) {
swapped = false;
for (j = n - 1; j > i; --j) { // 從底部向上冒泡
if (r[j] < r[j - 1]) {
temp = r[j];
r[j] = r[j - 1];
r[j - 1] = temp;
swapped = true;
}
}
if (!swapped) break; // 本趟無交換 → 已有序,提前退出
}
}
/* 打印數組 */
void print_array(const int r[], int n) {
for (int i = 0; i < n; ++i) printf("%4d", r[i]);
putchar('\n');
}
int main(void) {
int a[] = {38, 20, 46, 38, 74, 91, 12, 25};
int n = sizeof(a) / sizeof(a[0]);
printf("排序前: "); print_array(a, n);
bubble_sort(a, n);
printf("排序后: "); print_array(a, n);
return 0;
}
| 優化點 | 說明 |
|---|---|
外層迴圈 i < n-1 | 最多 n-1 趟;最後一個元素自然就位 |
內層 j > i 逆序遍歷 | 每趟將最小值推到索引 i 處 |
swapped 標誌 | 若某趟無交換,說明已有序,直接 break,最好情況 O(n) |
| 索引從 0 開始 | 符合 C 語言數組習慣,避免原文 1-based 易錯風格 |