C 为什么这些排序标准中的一个有效,而另一个无效?

C 为什么这些排序标准中的一个有效,而另一个无效?,c,sorting,for-loop,if-statement,C,Sorting,For Loop,If Statement,我正在研究一个程序的一部分,它根据几个标准对数组中的帖子进行排序。在程序到达最后一个代码块之前,帖子的排序都很好 这段代码按其应该的方式对帖子进行排序: for (i = 0; i < 11; i++) for (j = i + 1; j < 12; j++) if (serie[j].poang == serie[i].poang) if ((serie[j].gjorda - serie[j].inslappta) < (s

我正在研究一个程序的一部分,它根据几个标准对数组中的帖子进行排序。在程序到达最后一个代码块之前,帖子的排序都很好

这段代码按其应该的方式对帖子进行排序:

for (i = 0; i < 11; i++) 
    for (j = i + 1; j < 12; j++)
        if (serie[j].poang == serie[i].poang)
            if ((serie[j].gjorda - serie[j].inslappta) < (serie[i].gjorda - serie[i].inslappta))
            {
                temp.poang = serie[i].poang;
                serie[i].poang = serie[j].poang;
                serie[j].poang = temp.poang;

                temp.gjorda = serie[i].gjorda;
                serie[i].gjorda = serie[j].gjorda;
                serie[j].gjorda = temp.gjorda;

                temp.inslappta = serie[i].inslappta;
                serie[i].inslappta = serie[j].inslappta;
                serie[j].inslappta = temp.inslappta;

                strcpy(temp.namn, serie[i].namn);
                strcpy(serie[i].namn, serie[j].namn);
                strcpy(serie[j].namn, temp.namn);
            }
(i=0;i<11;i++)的

对于(j=i+1;j<12;j++)
if(serie[j].poang==serie[i].poang)
if((serie[j].gjorda-serie[j].inslappta)<(serie[i].gjorda-serie[i].inslappta))
{
temp.poang=系列[i].poang;
系列[i].波昂=系列[j].波昂;
系列[j].poang=临时poang;
temp.gjorda=系列[i].gjorda;
系列[i].gjorda=系列[j].gjorda;
系列[j].gjorda=临时gjorda;
温度inslappta=系列[i].inslappta;
系列[i].inslappta=系列[j].inslappta;
系列[j].inslappta=温度inslappta;
strcpy(temp.namn,serie[i].namn);
strcpy(serie[i].namn,serie[j].namn);
strcpy(系列[j].namn,临时namn);
}
虽然这一点似乎根本不会影响排序(我甚至尝试在执行此操作时反转“:

if (serie[j].poang == serie[i].poang)
    if ((serie[j].gjorda - serie[j].inslappta) < (serie[i].gjorda - serie[i].inslappta))
        if(serie[j].gjorda < serie[i].gjorda)
您的函数是(序列类型为
S*
):


原始if的主要问题是没有指定when.poang不相等的顺序。如果原始数组的.poang具有所有不同的值,则顺序永远不会更改。

是类似于
serie[j].gjorda-serie[j].inslappta
serie[i].gjorda-serie[i]的减法.inslappta
是否会溢出?您应该显示结构定义。这可能与
namn
成员的定义方式有关。If可能是数组(
char-namn[30];
)或指针(
char*namn;
)或者你可能很有创意,做了其他事情。使用指针,你必须担心存储空间;使用数组,你不需要。你应该看看是否也可以使用结构赋值。交换很复杂。建议
temp=serie[i];serie[i]=serie[j];serie[j]=temp;
。您正在应用不同的排序标准,因此结果可能会有所不同。前导相等条件不常见。这意味着,如果比较记录的
poang
元素不同,则不需要交换这些记录;它们已按排序顺序排列。也许您应该显示一些示例数据,以及实际和预期的结果?请阅读有关如何创建MCVE()-虽然您已经最小化了代码,但您没有提供完整的示例,也没有显示数据。为什么您不使用内置的
qsort()
函数?您是否可以改述一下“您实际上是在说所有这些条件的&&&“我不知道该怎么办that@JakobEklund:只有当(1)
(serie[j].poang==serie[i].poang)
和(2)
((serie[j].gjorda-serie[j].inslappta)
和(3)
(serie[j].gjorda
。如果其中任何一个条件为假,则不进行交换。@JonathanLeffler哦,我知道我现在哪里出错了,这就解决了问题。感谢所有评论的人!
if (serie[j].poang == serie[i].poang)
    if ((serie[j].gjorda - serie[j].inslappta) < (serie[i].gjorda - serie[i].inslappta))
        if(serie[j].gjorda < serie[i].gjorda)
if (!isInOrder(serie, i, j)) {
     // swap
}
int isInOrder(S *array, int i, int j) {
    // fill this in. Return 1 if they are in order, 0 if not
}