問題:輸入三整數 a, b, c,升序輸出
方法一:暴力枚舉 6 種排列(教學用)
if (a <= b && b <= c) printf("%d %d %d", a, b, c);
else if (a <= c && c <= b) printf("%d %d %d", a, c, b);
else if (b <= a && a <= c) printf("%d %d %d", b, a, c);
else if (b <= c && c <= a) printf("%d %d %d", b, c, a);
else if (c <= a && a <= b) printf("%d %d %d", c, a, b);
else printf("%d %d %d", c, b, a);
- ✅ 邏輯直觀、無交換操作
- ❌ 分支過多、擴展性極差 (n! 條件)
方法二:三輪兩兩比較交換(推薦通用)
int t;
if (a > b) { t = a; a = b; b = t; } // 確保 a ≤ b
if (a > c) { t = a; a = c; c = t; } // 確保 a ≤ c (a 為最小)
if (b > c) { t = b; b = c; c = t; } // 確保 b ≤ c
printf("%d %d %d", a, b, c);
- ✅ 邏輯清晰:選擇排序 思想,固定 3 次比較、最多 3 次交換
- ✅ 易擴展為陣列排序
- ✅ 無溢位風險
方法三:極值法(數學技巧)
int x = a, z = a; // x=最小, z=最大
if (b < x) x = b; if (c < x) x = c;
if (b > z) z = b; if (c > z) z = c;
int y = a + b + c - x - z; // 中間值 = 總和 - 最小 - 最大
printf("%d %d %d", x, y, z);
- ✅ 僅比較、無交換、無臨時變數 (除極值變數)
- ⚠️ 溢位風險:
a+b+c 可能超出 int 範圍
- ⚠️ 僅適用數值型別
效能與適用性對比
| 方法 | 比較次數 | 交換/賦值 | 溢位風險 | 型別通用性 | 推薦場景 |
| 暴力枚舉 | 最多 5 條件判斷 | 0 | 無 | 所有可比較 | 教學、極小 n |
| 三輪交換 | 3 | ≤3 | 無 | 所有可比較/交換 | 通用首選 |
| 極值法 | 4 | 4 賦值 | 高 (求和) | 數值型別 | 嵌入式/寄存器受限 |
附錄:倒三角形列印 (n 層)
/* 輸入 n=5
* * * * *
* * * *
* * *
* *
*
*/
#include
int main() {
int n;
scanf("%d", &n);
for (int row = n; row >= 1; row--) {
// 前導空格:每層遞增 2 字元 (對齊 "* ")
for (int s = 0; s < n - row; s++) printf(" ");
// 星號:每行 2*row-1 個,間隔空格
for (int k = 0; k < 2 * row - 1; k++) printf("* ");
putchar('\n');
}
return 0;
}
倒三角幾何規律
- 第
i 行 (1-based, 從上往下):n-i 組前導空格,2*i-1 個星號
- 或反向迴圈
row = n..1:前導 n-row,星號 2*row-1
- 星號間空格確保對齊視覺寬度一致
面試延伸題
- 不使用臨時變數交換:XOR 交換 (整數)、算術交換 (風險)
- 擴展至 N 數排序:選擇/插入/快速排序,
qsort 標準庫
- 三數中位數:
mid = a + b + c - min(a,b,c) - max(a,b,c) (同極值法)
- 硬體實現:比較器網路、排序網路