原始碼問題
for (i=0;i
錯誤分析
- 內層迴圈 `j=1` 固定從 1 開始,應為 `j = i + 1`(只比較未排序部分)。
- 交換邏輯錯誤:`t` 未賦值,且賦值順序導致資料遺失。正確交換需 `t = a[i]; a[i] = a[index]; a[index] = t;`。
- 交換操作應在**內層迴圈結束後**(找到最小值索引)執行一次,而非在內層迴圈內每次比較都交換。
- `printf("%d", &a[i]);` 應為 `%d` 對應 `a[i]`,而非位址 `&a[i]`。
修正版選擇排序
#include
int main(void) {
int n, a[10], i, j, t, index;
printf("Input n: ");
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &a[i]);
for (i = 0; i < n - 1; i++) { // 只需 n-1 趟
index = i;
for (j = i + 1; j < n; j++) { // 從 i+1 找最小值
if (a[j] < a[index]) index = j;
}
if (index != i) { // 找到更小值才交換
t = a[i];
a[i] = a[index];
a[index] = t;
}
}
printf("After: ");
for (i = 0; i < n; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
選擇排序核心邏輯
- **外層**:`i = 0` 到 `n-2`,代表當前要確定的位置。
- **內層**:`j = i+1` 到 `n-1`,在剩餘元素中找最小值索引 `index`。
- **交換**:若 `index != i`,交換 `a[i]` 與 `a[index]`。
- **時間複雜度**:O(n²),交換次數最少(O(n)),適合寫入成本高的場景。
除錯技巧
- 加入列印觀察每趟結果:`printf("Pass %d: ", i); for(k=0;k
- 使用編譯器警告:`-Wall` 會提示 `t` 未初始化、`&a[i]` 格式不符。