0

我有一个看起来像这样的二维数组;

0. PID: 0, PRI:-1
1. PID: 0, PRI:-1
2. PID: 0, PRI:-1
3. PID: 15, PRI:4
4. PID: 209, PRI:5
5. PID: 0, PRI:0
6. PID: 0, PRI:0
7. PID: 0, PRI:0
8. PID: 0, PRI:0
9. PID: 0, PRI:0

将具有有效 PRI(其中 PRI > 0)的 PI​​D 移动到数组顶部,同时根据 PRI 保持数字顺序的最快和最合乎逻辑的方法是什么。

谢谢

4

2 回答 2

0

至少从您的描述来看,您只关心对 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,并且(假设您正确进行了比较)不需要稳定的排序。如果您决定首先对一个字段进行排序(几乎总是较慢),然后对第二个字段进行第二次(单独)排序,而不是在一次比较中比较所有相关字段,则您只需要一个稳定的排序。

于 2013-02-28T05:24:15.710 回答
0

您可以按降序对 PRI 上的数组进行排序。或者,您可以像这样定义无效的 PRI,而不是使用 -1:

const int INVALID_PRI = INT_MAX;

并对 PRI 列上的数组进行排序。

于 2013-02-28T06:13:49.370 回答