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

C語言結構體多關鍵字排序:鋼管篩選問題完整解析

     編輯:程式設計疑難解答

問題描述

從倉庫中按以下優先級篩選鋼管:

  1. 長度最長
  2. 長度相同中直徑最小
  3. 前兩條相同中編碼最大(生產日期最新)

輸入多組測試數據,每組輸出符合條件的鋼管編碼。

算法思路:分級排序

利用 qsort 進行三次排序,每次縮小範圍:

struct Pipe {
    int len;   // 長度
    int dia;   // 直徑
    int code;  // 編碼
} pipes[1001];

// 比較函數
int cmp_len(const void* a, const void* b) {
    return ((Pipe*)b)->len - ((Pipe*)a)->len;  // 長度降序
}
int cmp_dia(const void* a, const void* b) {
    return ((Pipe*)a)->dia - ((Pipe*)b)->dia;  // 直徑升序
}
int cmp_code(const void* a, const void* b) {
    return ((Pipe*)b)->code - ((Pipe*)a)->code; // 編碼降序
}

int main() {
    int N; scanf("%d", &N);
    while (N--) {
        int n; scanf("%d", &n);
        for (int i=0; i

關鍵點解析

1. 比較函數簽名

int cmp(const void* a, const void* b) 是 qsort 要求的標準形式。內部強轉為實際結構體指標後比較。

2. 返回值含義

  • < 0:a 排在 b 前面
  • = 0:順序不變
  • > 0:b 排在 a 前面

本題中 bool 或 int 均可,關鍵是正負號語義正確。

3. 穩定性考量

qsort 不保證穩定,但本題每級排序範圍互不重疊(僅在前一級相等組內排序),故不影響最終結果。

進階優化:單次排序 + 自定義比較

int cmp_all(const void* a, const void* b) {
    Pipe* p1 = (Pipe*)a;
    Pipe* p2 = (Pipe*)b;
    if (p1->len != p2->len) return p2->len - p1->len;      // 長度降序
    if (p1->dia != p2->dia) return p1->dia - p2->dia;      // 直徑升序
    return p2->code - p1->code;                            // 編碼降序
}
// 直接 qsort(pipes, n, sizeof(Pipe), cmp_all); 即可

單次排序時間複雜度 O(n log n),代碼更簡潔,推薦實戰使用。

總結

多關鍵字排序可採用「分級篩選+多次排序」或「單次排序+復合比較函數」。理解 qsort 比較函數契約是核心,靈活運用結構體數組解決實際業務篩選問題。

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