首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言選擇排序填空題詳解:從邏輯漏洞到正確實現

     編輯:C 語言問答

題目回顧

給定一個包含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),從當前元素下一位開始比較。

選擇排序算法原理

  1. 外層循環 i 從 0 到 n-2,表示當前待確定位置
  2. 內層循環 j 從 i+1 到 n-1,尋找最小值索引 k
  3. 若 k != i,交換 data[i] 和 data[k]
  4. 時間複雜度 O(n²),空間複雜度 O(1),不穩定排序

填空答案與完整代碼

空號位置填入內容說明
1外層循環條件i<10 或 i<910個元素只需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交換後數組
10090 2 8 1 9 3 7 4 6 5
21130 1 8 2 9 3 7 4 6 5
32270 1 2 8 9 3 7 4 6 5
...............
98590 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)不穩定嵌入式、實時系統、保證最壞情況
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved