給定一個包含10個整數的數組,使用選擇排序法從小到大排序並輸出。原代碼存在五個填空和一個邏輯錯誤。
for(i=0;____;++i){ /*第一個空*/
k=i;
for(j=j+1;j<10;++j){ // ❌ 錯誤:j未初始化
if(data[k]>data[j]){
k=_____; /*第二個空*/
}
}
value=______; /*第三個空*/
____________; /*第四個空*/
_______=value; /*第五個空*/
}
for(j=j+1;j<10;++j) 中 j 未初始化,導致未定義行為。正確應為 for(j=i+1;j<10;++j),從當前元素下一位開始比較。
i 從 0 到 n-2,表示當前待確定位置j 從 i+1 到 n-1,尋找最小值索引 kk != i,交換 data[i] 和 data[k]| 空號 | 位置 | 填入內容 | 說明 |
|---|---|---|---|
| 1 | 外層循環條件 | i<10 或 i<9 | 10個元素只需9輪比較 |
| 2 | 記錄最小值索引 | j | 發現更小元素時更新索引 |
| 3 | 暫存當前元素 | data[i] | 交換前保存值 |
| 4 | 將最小值移至當前位置 | data[i]=data[k] | 覆蓋當前位置 |
| 5 | 將暫存值移至最小值原位置 | data[k] | 完成交換 |
#include <stdio.h>
void main() {
int i, j, k, value, data[10];
printf("Input 10 numbers:\n");
for(i=0; i<10; i++) {
scanf("%d", &data[i]);
}
for(i=0; i<10; ++i) { // 第一個空:i<10
k = i;
for(j=i+1; j<10; ++j) { // 修正:j=i+1 而非 j=j+1
if(data[k] > data[j]) {
k = j; // 第二個空:j
}
}
value = data[i]; // 第三個空:data[i]
data[i] = data[k]; // 第四個空:data[i]=data[k]
data[k] = value; // 第五個空:data[k]=value
}
for(i=0; i<10; i++) {
printf("%5d", data[i]);
}
printf("\n");
}
輸入:5 2 8 1 9 3 7 4 6 0
| 輪次 | i | 找到最小值 | 索引k | 交換後數組 |
|---|---|---|---|---|
| 1 | 0 | 0 | 9 | 0 2 8 1 9 3 7 4 6 5 |
| 2 | 1 | 1 | 3 | 0 1 8 2 9 3 7 4 6 5 |
| 3 | 2 | 2 | 7 | 0 1 2 8 9 3 7 4 6 5 |
| ... | ... | ... | ... | ... |
| 9 | 8 | 5 | 9 | 0 1 2 3 4 5 6 7 8 9 |
// 優化:若k未改變則無需交換
if (k != i) {
value = data[i];
data[i] = data[k];
data[k] = value;
}
| 算法 | 平均時間 | 最壞時間 | 空間 | 穩定性 | 適用場景 |
|---|---|---|---|---|---|
| 選擇排序 | O(n²) | O(n²) | O(1) | 不穩定 | 小規模、空間受限、交換代價大 |
| 插入排序 | O(n²) | O(n²) | O(1) | 穩定 | 近乎有序、小規模 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不穩定 | 通用、大數據量 |
| 歸併排序 | O(n log n) | O(n log n) | O(n) | 穩定 | 外部排序、鏈表、需穩定 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不穩定 | 嵌入式、實時系統、保證最壞情況 |