至少从您的描述来看,您只关心对 PRI 值进行排序,但希望负值排在正值之后(但正值要按顺序排列)。
一种简单的方法是在进行比较之前将 PRI 值强制转换为无符号。当转换为无符号时,负值将以 2 N -1 为模减少,因此(例如)-1 将转换为 UINT_MAX(更重要的是,所有负数都将转换为大于任何开始为正数的无符号数签名号码)。
typedef struct {
int PID;
int PRI;
} proc;
int cmp(void const *a, void const *b) {
proc const *aa = (proc const *)a;
proc const *bb = (proc const *)b;
if ((unsigned)(bb->PRI) < (unsigned)(aa->PRI))
return -1;
if ((unsigned)(aa->PRI) < (unsigned)(bb->PRI))
return 1;
return 0;
}
最后,您可能还希望添加 PID 的比较,而不是仅基于 PRI 值的相等性返回 0,因此将按 PID 对等于 PRI 值的项目进行排序。我暂时忽略了它,因为你没有说你真的需要/想要它(它使代码更长一些并且可能更难理解,特别是如果你不期望它在那里)。
编辑:如果不清楚,则此比较功能旨在与 一起使用qsort
,并且(假设您正确进行了比较)不需要稳定的排序。如果您决定首先对一个字段进行排序(几乎总是较慢),然后对第二个字段进行第二次(单独)排序,而不是在一次比较中比较所有相关字段,则您只需要一个稳定的排序。