CS50 pset 3:Tideman sort_pairs函数。

问题描述 投票:0回答:1

我需要一些帮助来理解这个函数背后的逻辑。这是我目前在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数组中比较胜利的强度,因为我已经有数据存储在那里?

quicksort cs50
1个回答
1
投票

你不需要把这个弄得这么复杂,你可以在这里使用你自己的排序方式。让我们尝试一个简单的插入排序--。

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.

这就差不多了!,这只是一个插入式排序,但它的 钥匙 是重要的部分。

© www.soinside.com 2019 - 2024. All rights reserved.