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

C++ 結構體數組多字段排序:qsort 比較函數編寫與浮點數比較注意事項

     編輯:程式設計疑難解答

C++ 結構體數組多字段排序:qsort 比較函數編寫與浮點數比較注意事項

需求:對結構體數組按多字段排序(如先按成績降序,成績相同再按年齡升序)。qsort 配合自定義比較函數可完美實現。

比較函數模板

typedef struct {
    char name[20];
    float score;  // 浮點數字段
    int age;
} Student;

int cmp_student(const void* a, const void* b) {
    Student* s1 = (Student*)a;
    Student* s2 = (Student*)b;
    
    // 1. 主鍵:score 降序
    if (s1->score > s2->score) return -1;
    if (s1->score < s2->score) return 1;
    
    // 2. 次鍵:age 升序
    if (s1->age < s2->age) return -1;
    if (s1->age > s2->age) return 1;
    
    // 3. 兜底:name 字典序
    return strcmp(s1->name, s2->name);
}

調用示例

Student stu[100];
int n = 50; // 實際數量
qsort(stu, n, sizeof(Student), cmp_student);

浮點數比較陷阱與對策

  • 不要用 == 比較浮點數:精度誤差導致邏輯錯誤。
  • 推薦:定義容差 EPS:
    const float EPS = 1e-6;
    if (fabs(s1->score - s2->score) > EPS) {
        return (s1->score > s2->score) ? -1 : 1;
    }
  • 或轉整數比較:若精度固定(如保留 2 位小數),乘 100 轉 int 再比。

C++ 優先選 std::sort

sort(stu, stu+n, [](const Student& a, const Student& b){
    if (fabs(a.score - b.score) > EPS) return a.score > b.score;
    if (a.age != b.age) return a.age < b.age;
    return a.name < b.name;
});

std::sort 類型安全、內聯優化、支持 Lambda,除非嵌入式環境無 STL,否則優先使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved