在了解此功能背后的逻辑时,我需要一些帮助。这是我目前在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]
)。我以前的函数表决,record_preferences和add_pairs都清除了check50。我还没有超越sort_pairs。
为什么我不能直接从对数组比较胜利的力量,因为我已经在其中存储了数据?
答案 0 :(得分:3)
您无需使其变得如此复杂,您可以在此处使用自己的排序方式。让我们尝试一个简单的插入排序-
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
开始,因为我要与 previous 元素({{ 1}})
现在,我们检查当前元素中的所有先前元素,并将它们与键-j = i - 1
这是应该排序的键。 preferences[pairs[INDEX].winner][pairs[INDEX].loser]
表示偏爱preferences[WINNER_ID][LOSER_ID]
胜过WINNER_ID
的人数。
差不多了!这只是一个插入排序,但是 key 是重要的部分。