找到数组中的 n 个最大元素

find the n largest elements in an array

我有一个数组,我需要在数组中找到 n 个结例 {1,2,3,3} 我需要程序 return 两个 3

void print_winner(void)
{
    // TODO
    string arr[9];
    string name = "";
    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest<candidates[i].votes)
        {
            largest = candidates[i].votes;
            name = candidates[i].name;
        }

    }

    // arr[0] = name;
    printf("%s\n", name);
    return;
}

在此代码中,candidates 是一个具有两个属性的结构:name 和 votes 我需要程序打印得票最多的名字,即使有 3 路平局

我在想我会遍历列表找到最大的 int 然后删除那个 int 并再次遍历列表以查看是否有任何元素等于原始列表中的最大元素,如果是,则将名称添加到数组中,然后最后打印所有的名字

我认为你只需要在找到获得最多选票的候选人后再次循环数组,看看是否有另一个或更多候选人获得相同的票数。 votes.No 的需要删除记录。

通常好的编程方法是将问题分解并解决它的各个部分。

在这种情况下,设置问题的一种方法是打印所有得分最高的人的名字。但是这个问题有点复杂。

另一种设置问题的方法如下:

  • 找到最高分。
  • 找到最高分后,打印所有得分最高的人的名字。

这些子问题中的每一个都比较容易,应该一起解决问题。

我更喜欢教别人如何钓鱼,所以我不想破坏或破坏您通过在代码中为您实施解决方案来学习和改进并变得出色的机会。非常欢迎您要求澄清,但是,我非常愿意提供帮助:)。

在您通过每一次计票之前,您不知道 largest 计票。 当发现真正更大的 largest 时,需要更正当前最大的名称。也一样:

void print_winner_1(void)
{
    // globals: candidates: array
    //          voter_count: size of array

    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest < candidates[i].votes)
        {
            largest = candidates[i].votes;
        }

    }
    for (int i = 0; i < voter_count; i++)
    {
        if (largest == candidates[i].votes)
        {
            printf("%s\n", candidates[i].name);
        }

    }
}

上面可以存储一个 largest_first_i 以提高速度。

正在收集完整的中介结果:

void print_winner_2(void)
{
    // globals: candidates: array
    //          voter_count: size of array

    string names[9]; // Tie names.
    int name_count = 0;
    int largest = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (largest < candidates[i].votes)
        {
            name_count = 0; // Reset list of ties.
            largest = candidates[i].votes;
        }
        if (largest == candidates[i].votes)
        {
            if (name_count == 9) { // More than 9 temporary (!) ties.
                print_winner_1();
                return;
            }
            names[name_count++] = candidates[i].name;
        }

    }
    for (int i = 0; i < name_count; i++)
    {
        printf("%s\n", names[i]);
    }
}

我做了一个有两个完整的循环,一个立即收集领带。 第二种解决方案容易导致结果数组溢出(如果有超过 9 个候选者),例如 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 23] 的情况下第一个中间关系会溢出最大 == 0.

另外,第二个不需要更快,因为您需要存储到 names 中,并且每次增加 largest。几乎是一个过早优化的案例。