輸入三個整數 a, b, c,按從大到小順序輸出。原題提及「模板函數」但 C 語言無模板,實為普通函數。核心考點:交換排序邏輯、比較次數優化、泛型編程思想在 C 中的模擬。
#include <stdio.h>
void sort(int l, int m, int n);
int main() {
int a, b, c;
printf("請輸入三個數: ");
scanf("%d %d %d", &a, &b, &c);
sort(a, b, c);
return 0;
}
void sort(int l, int m, int n) {
int t;
if (l < m) { t = l; l = m; m = t; } // 確保 l >= m
if (l < n) { t = l; l = n; n = t; } // 確保 l 為最大
if (m < n) { t = m; m = n; n = t; } // 確保 m >= n
printf("排序後,由大到小: %d %d %d\n", l, m, n);
}
三元素排序的決策樹下界為 log₂(3!) ≈ 2.58 → 至少 3 次比較。原代碼恰好 3 次,屬於最優比較排序網絡。
l, m, n 易混淆,建議用 a, b, c 或 x, y, z。
#define SWAP(x, y) do { int tmp = x; x = y; y = tmp; } while(0)
void sort_macro(int a, int b, int c) {
if (a < b) SWAP(a, b);
if (a < c) SWAP(a, c);
if (b < c) SWAP(b, c);
printf("%d %d %d\n", a, b, c);
}
#include <stdlib.h>
int cmp_int_desc(const void *a, const void *b) {
return (*(int*)b - *(int*)a); // 降序
}
void sort_generic(void *base, size_t nmemb, size_t size,
int (*compar)(const void*, const void*)) {
qsort(base, nmemb, size, compar);
}
// 使用
int arr[3] = {a, b, c};
sort_generic(arr, 3, sizeof(int), cmp_int_desc);
#define DEFINE_SORT(type, name) \
void name(type *a, type *b, type *c) { \
type t; \
if (*a < *b) { t = *a; *a = *b; *b = t; } \
if (*a < *c) { t = *a; *a = *c; *c = t; } \
if (*b < *c) { t = *b; *b = *c; *c = t; } \
}
DEFINE_SORT(int, sort_int)
DEFINE_SORT(float, sort_float)
DEFINE_SORT(double, sort_double)
#define SORT3(a, b, c) _Generic((a), \
int: sort3_int, \
float: sort3_float, \
double: sort3_double \
)(a, b, c)
| 場景 | 推薦方案 | 複雜度 |
|---|---|---|
| 固定 3 元素 | 比較網絡 (3次比較) | O(1) |
| 小規模 (n≤32) | 插入排序 / 網絡排序 | O(n²) 但常數小 |
| 通用大規模 | qsort (快排/混合排序) | O(n log n) |
| 近乎有序 | 插入排序 / Timsort | O(n) |
三數排序看似簡單,實則蘊含最優比較網絡、泛型編程模擬、C 語言類型系統限制等深層主題。關鍵收穫:
SWAP 需用 do{}while(0) 包裹防語法陷阱;