Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在结构上实现排序算法_C_Bubble Sort_Selection Sort - Fatal编程技术网

C 在结构上实现排序算法

C 在结构上实现排序算法,c,bubble-sort,selection-sort,C,Bubble Sort,Selection Sort,我正在编写一个程序,使用蒂德曼选举系统计算选举的获胜者 我定义了一个名为pair的结构,其中比较了两个候选对象。得票最多的候选人的指数由获胜者表示,得票最少的候选人由失败者表示 // Each pair has a winner, loser typedef struct { int winner; int loser; } pair; 这些对存储在对数组中 pair pairs[MAX * (MAX - 1) / 2]; 我正在尝试按胜利强度的降序对这个配对数组进行排序(

我正在编写一个程序,使用蒂德曼选举系统计算选举的获胜者

我定义了一个名为pair的结构,其中比较了两个候选对象。得票最多的候选人的指数由
获胜者
表示,得票最少的候选人由
失败者
表示

// Each pair has a winner, loser
typedef struct
{
    int winner;
    int loser;
}
pair;
这些对存储在
对数组中

pair pairs[MAX * (MAX - 1) / 2]; 
我正在尝试按胜利强度的降序对这个配对数组进行排序(定义为
胜利者的票数减去
失败者的票数)

候选人通过其候选人索引被编入
投票计数
,元素返回其投票计数。最大值是指候选人的最大数量

int vote_count[MAX]; // where i is the index of the candidate and the return value is the number of votes. 
以下是我对选择排序的实现:

int max_idx;  // index of element with the highest strength of victory

// one by one move boundary of unsorterd subarray
for (int i = 0; i < array_size - 1; i++)
{
    max_idx = i;
    
    for (int j = i + 1; j < array_size; j++)
    {
        if (vote_count[pairs[j].winner] - vote_count[pairs[j].loser] > vote_count[pairs[i].winner] - vote_count[pairs[i].loser])
        {
            max_idx = j;
        }
    }

    if (max_idx != i)
    {
        // swap the element with the highest strength of victory with the first element
        swap(&pairs[max_idx], &pairs[i]);
    }
}
return;
调用另一个函数vote:

// Update ranks given a new vote
bool vote(int rank, string name, int ranks[])
{
    // iterate through candidates
    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp (name, candidates[i]) == 0)          // if vote is for a valid candidate
        {
            // update rank array
            ranks[rank] = i;
            vote_count[i]++;
            return true;
        }

}
// if no candidate is found
return false;
//更新获得新投票的排名
布尔投票(整数排名、字符串名称、整数排名[])
{
//反复浏览候选人
对于(int i=0;i
}


选择排序或冒泡排序对我都不起作用,请告诉我哪里出了问题。

这并不能完全回答您的问题,但您可以创建一个比较函数并使用:

如果你愿意的话,你可以把它写成一行,但是读起来会更难

然后,这种情况就变成了现实

#include <stdlib.h>

...

qsort(pairs, MAX * (MAX - 1) / 2, sizeof(pair), compare_pair);
#包括
...
qsort(成对,最大*(最大-1)/2,sizeof(成对),compare_成对);

这并不能完全回答您的问题,但您可以创建一个比较器函数并使用:

如果你愿意的话,你可以把它写成一行,但是读起来会更难

然后,这种情况就变成了现实

#include <stdlib.h>

...

qsort(pairs, MAX * (MAX - 1) / 2, sizeof(pair), compare_pair);
#包括
...
qsort(成对,最大*(最大-1)/2,sizeof(成对),compare_成对);


&pairs[j]
pairs+j
。另外,什么是
交换
?我们如何知道它得到了正确的实现?调试工具对于确认您的期望非常有用。您使用的IDE是什么?@MadPhysician我现在已经包括了交换函数,谢谢排序看起来正确,但所有的排序都取决于(a)
vote\u count
的大小是否足以被所有正在进行的查找索引,以及(b)
swap
是否正常工作。唉,由于没有提供,我们没有任何一个用于验证。现在您需要显示示例输入和输出,以证明您确实有问题……
&pairs[j]
pairs+j
。另外,什么是
交换
?我们如何知道它得到了正确的实现?调试工具对于确认您的期望非常有用。您使用的IDE是什么?@MadPhysician我现在已经包括了交换函数,谢谢排序看起来正确,但所有的排序都取决于(a)
vote\u count
的大小是否足以被所有正在进行的查找索引,以及(b)
swap
是否正常工作。唉,由于没有提供,我们没有这两种验证。现在您需要显示示例输入和输出,以证明您确实存在问题。
赢家和输家是(显然)候选标识符,而不是赢家和输家计数。他们的获胜计数记录在神秘的
投票计数
数组中。这仍然适用于对比较器的修改,但所有这些都取决于
vote\u count
实际上允许对域中的所有候选ID进行索引,我怀疑这才是真正的问题所在。@WhozCraig。抢手货我最初没有注意到这一点。现在修复了是的,我怀疑索引是事情偏离轨道的地方。如果OP没有正确的mcve,就无法确定。OPs选择排序看起来是正确的,假设
投票计数
是正确的,并且所有赢家和输家的条目都成立。@WhozCraig。我的想法以及
赢家
输家
都是(显然)候选标识符,而不是赢家和输家。他们的获胜计数记录在神秘的
投票计数
数组中。这仍然适用于对比较器的修改,但所有这些都取决于
vote\u count
实际上允许对域中的所有候选ID进行索引,我怀疑这才是真正的问题所在。@WhozCraig。抢手货我最初没有注意到这一点。现在修复了是的,我怀疑索引是事情偏离轨道的地方。如果OP没有正确的mcve,就无法确定。OPs选择排序看起来是正确的,假设
投票计数
是正确的,并且所有赢家和输家的条目都成立。@WhozCraig。我的想法也是如此
/* Vote count needs to be global or file static for this to work */
int vote_count[...];

...

int compare_pair(const void *p1, const void *p2)
{
    int d1 = vote_count[((const pair *)p1)->winner] - vote_count[((const pair *)p1)->loser];
    int d2 = vote_count[((const pair *)p2)->winner] - vote_count[((const pair *)p2)->loser];
    return d2 - d1;
}
#include <stdlib.h>

...

qsort(pairs, MAX * (MAX - 1) / 2, sizeof(pair), compare_pair);