代碼實現
[c]
#include
int u, v; // 全域變數存放結果
// 找出陣列中最大值 u 與最小值 v
void find_u_v(int *p, int n) {
int *q;
u = v = *p; // 初始化為第一個元素
for (q = p; q < p + n; q++) {
if (u < *q) u = *q; // 更新最大值
else if (v > *q) v = *q; // 更新最小值
}
}
int main() {
int i, num[10];
printf("input 10 numbers\n");
for (i = 0; i < 10; i++)
scanf("%d", &num[i]);
find_u_v(num, 10);
printf("\n\n u=%d; v=%d\n", u, v);
return 0;
}
關鍵點解析
- 指標遍歷:
q = p; q < p + n; q++ 利用指標算術逐元素訪問,無需索引變數。
- 初始化策略:以首元素
*p 初始化 u、v,避免假設數值範圍 (如 INT_MIN/INT_MAX)。
- 單次遍歷雙更新:
if-else if 結構確保每輪最多兩次比較,平均 1.5 次/元素。
- 全域變數回傳:教學簡化用法;工程建議改為輸出參數
void find_u_v(int *p, int n, int *max, int *min)。
進階改進版
[c]
#include
void find_min_max(const int *arr, size_t n, int *pmin, int *pmax) {
if (!arr || n == 0 || !pmin || !pmax) return;
int min = INT_MAX, max = INT_MIN;
for (size_t i = 0; i < n; i++) {
if (arr[i] < min) min = arr[i];
if (arr[i] > max) max = arr[i];
}
*pmin = min; *pmax = max;
}
- 使用
const、size_t、INT_MIN/MAX、輸出參數、錯誤檢查,更符合工業規範。
- 可進一步展開為 兩兩比較法 (每次取兩元素比較後再與極值比),比較次數從
2n 降至 1.5n。