CS50 pset 3:Tideman sort_pairs函数

时间:2020-06-15 07:16:32

标签: quicksort cs50

在了解此功能背后的逻辑时,我需要一些帮助。这是我目前在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。

为什么我不能直接从对数组比较胜利的力量,因为我已经在其中存储了数据?

1 个答案:

答案 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 是重要的部分。