從倉庫中按以下優先級篩選鋼管:
輸入多組測試數據,每組輸出符合條件的鋼管編碼。
利用 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
int cmp(const void* a, const void* b) 是 qsort 要求的標準形式。內部強轉為實際結構體指標後比較。
< 0:a 排在 b 前面= 0:順序不變> 0:b 排在 a 前面本題中 bool 或 int 均可,關鍵是正負號語義正確。
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 比較函數契約是核心,靈活運用結構體數組解決實際業務篩選問題。