我需要一些帮助来理解这个函数背后的逻辑。这是我目前在Tideman中的sort_pairs函数。
// Sort pairs in decreasing order by the strength of victory
void sort_pairs(void)
{
qsort(pairs, pair_count, sizeof(pair), compare);
return;
}
// Function for sort_pairs
int compare(const void *a, const void *b)
{
const pair *p1 = (const pair *) a;
const pair *p2 = (const pair *) b;
if (p1->winner < p2->winner)
{
return -1;
}
else if (p1->winner > p2->winner)
{
return 1;
}
else
{
return 0;
}
}
这不能清除check50,我在网上寻找如何解决这个问题。似乎大多数函数都会比较偏好数组中的值(例如 preferences[pairs[i].winner][pairs[i].loser]
) . 我之前的函数vote、record_preferences和add_pairs都清除了check50。我还没有超越sort_pairs。
为什么我不能直接从pair数组中比较胜利的强度,因为我已经有数据存储在那里?
你不需要把这个弄得这么复杂,你可以在这里使用你自己的排序方式。让我们尝试一个简单的插入排序--。
void sort_pairs()
{
pair temp;
for (int i = 1, j; i < pair_count; i++)
{
temp = pairs[i];
j = i - 1;
for (; j >= 0 && preferences[pairs[j].winner][pairs[j].loser] < preferences[temp.winner][temp.loser]; j--)
{
pairs[j + 1] = pairs[j];
}
pairs[j + 1] = temp;
}
}
该 pair
结构看起来像
typedef struct
{
int winner;
int loser;
}
pair;
解释:-
我们通过每一对元素里面的 pairs
阵列--从 1
既然我要和 以前 元素j = i - 1
)
现在,我们从当前元素中检查所有之前的元素,并将它们与关键------进行比较。preferences[pairs[INDEX].winner][pairs[INDEX].loser]
这是你应该排序的关键。preferences[WINNER_ID][LOSER_ID]
指的是 喜欢的人的数量 WINNER_ID
在...上 LOSER_ID
.
这就差不多了!,这只是一个插入式排序,但它的 钥匙 是重要的部分。