我有一个看起来像这样的2D数组;
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)的PID移动到数组顶部的最快和最合理的方法是什么,同时根据PRI将它们保持在数字顺序。
由于
答案 0 :(得分:0)
至少从您的描述中,您只关心对PRI值进行排序,但希望负值在正值之后(但正值是有序的)。
执行此操作的一种简单方法是在执行比较之前将PRI值转换为unsigned。转换为无符号时,负值将以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,因此项目将等于PRI值将按PID排序。我现在已经离开了,因为你没有说你真的需要/想要它(它会使代码更长一些并且可能更难理解,特别是如果你不期望它在那里)。
编辑:如果不清楚,此比较函数旨在与qsort
一起使用,并且(假设您正确进行比较)不需要稳定的排序。如果您决定首先在一个字段上排序(几乎总是较慢),然后在第二个字段上进行第二次(单独)排序,而不是在单个比较中比较所有相关字段,则只需要稳定排序。
答案 1 :(得分:0)
您可以按降序对PRI上的数组进行排序。或者不是使用-1,而是可以像这样定义无效的PRI:
const int INVALID_PRI = INT_MAX;
并在PRI列上对数组进行排序。