輸入三個整數 a, b, c,按從小到大順序輸出。核心考點:兩兩比較交換、排序網絡最優比較次數、變量命名規範。
#include
int main() {
int a, b, c, t;
printf("請輸入 a b c: ");
scanf("%d %d %d", &a, &b, &c);
// 確保 a <= b
if (a > b) { t = a; a = b; b = t; }
// 確保 a <= c (a 為最小)
if (a > c) { t = a; a = c; c = t; }
// 確保 b <= c
if (b > c) { t = b; b = c; c = t; }
printf("排序結果: %d %d %d\n", a, b, c);
return 0;
}
三元素全排列 3! = 6 種。比較決策樹葉子 ≥ 6 → 深度 ≥ log₂6 ≈ 2.58 → **至少 3 次比較**。本算法恰好 3 次,屬於**最優比較排序網絡**。
初始: a=3, b=1, c=2 1) a>b (3>1) → 交換: a=1, b=3, c=2 2) a>c (1>2) 偽 → 無交換: a=1, b=3, c=2 3) b>c (3>2) → 交換: a=1, b=2, c=3 結果: 1 2 3 ✓
#define SWAP(x, y) do { typeof(x) tmp = x; x = y; y = tmp; } while(0)
// typeof 是 GNU 擴展,標準 C 需針對類型定義
#define SWAP_INT(x, y) do { int tmp = x; x = y; y = tmp; } while(0)
if (a > b) SWAP_INT(a, b);
if (a > c) SWAP_INT(a, c);
if (b > c) SWAP_INT(b, c);
| 輸入 | 預期輸出 | 測試點 |
|---|---|---|
| 3 2 1 | 1 2 3 | 逆序 |
| 1 2 3 | 1 2 3 | 已排序 |
| 2 2 1 | 1 2 2 | 含重複值 |
| -5 0 5 | -5 0 5 | 負數 |
| 2147483647 -2147483648 0 | -2147483648 0 2147483647 | int 極值 |
| 100 100 100 | 100 100 100 | 全等 |
#include
int cmp_asc(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
void sort_array(int *arr, int n) {
qsort(arr, n, sizeof(int), cmp_asc);
}
三數排序是「最優比較網絡、交換宏、決策樹下界」的微型教科書。關鍵收穫:
SWAP 宏用 do{}while(0) 包裹防語法陷阱;