數組是 C 語言最基礎的數據結構,排序、求平均、最大/最小值是入門必練的三大經典操作。本文通過一個完整的選擇排序案例,講解數組操作的核心邏輯,並指出代碼中常見的邊界與變量作用域陷阱。
#include <stdio.h>
// 選擇排序:從小到大
void sort(int array[], int n) {
for (int i = 0; i < n - 1; ++i) { // 只需 n-1 輪
int minIdx = i; // 假設當前位置是最小值
for (int j = i + 1; j < n; ++j) { // 在未排序區尋找真正最小值
if (array[j] < array[minIdx]) {
minIdx = j;
}
}
// 交換
if (minIdx != i) {
int tmp = array[i];
array[i] = array[minIdx];
array[minIdx] = tmp;
}
}
}
int main() {
int a[10];
printf("請輸入 10 個整數:\n");
for (int i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
sort(a, 10);
printf("排序後:");
for (int i = 0; i < 10; ++i) {
printf("%d ", a[i]);
}
printf("\n");
// 統計:平均、最大、最小
int sum = 0, max = a[0], min = a[0];
for (int i = 0; i < 10; ++i) {
sum += a[i];
if (a[i] > max) max = a[i];
if (a[i] < min) min = a[i];
}
printf("平均值:%.2f\n最大值:%d\n最小值:%d\n", (double)sum / 10, max, min);
return 0;
}
i 從 0 到 n-2,每輪確定第 i 位置的最小值。j 從 i+1 到 n-1,掃描未排序區,記錄最小值下標 minIdx。minIdx != i 時交換,減少無用操作。qsort。max = min = a[0],避免魔法數字(如 INT_MIN)。double 防止整數除法截斷。| 原代碼問題 | 後果 | 修正 |
|---|---|---|
for(i=0;i) 缺少條件 | 編譯錯誤/死循環 | for(i=0; i<n-1; ++i) |
if(array[j]) 判斷非零而非比較大小 | 邏輯錯誤,非負數均視為「更小」 | if(array[j] < array[minIdx]) |
交換邏輯把 array[i] 覆寫前未保存 | 數據丟失 | 用 tmp 暫存 |
局部變量 i,j,k,t 混用、未初始化 | 未定義行為 | 在循環頭部用 int 聲明,就近初始化 |
#include <stdlib.h> qsort(a, 10, sizeof(int), cmp_int);,cmp_int 返回 *a - *b。n <= 0 直接返回,避免空數組崩潰。for 內聲明(C99),減少命名汙染與誤用風險。數組操作看似簡單,卻是指針算術、循環不變式、內存模型的綜合練兵場。寫對這三件小事,對理解鏈表、樹、圖等高級結構大有裨益。記住:先寫正確,再優化;邊界永遠先於邏輯。