c - 为什么这些排序标准之一起作用,而另一个不起作用?

标签 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) < (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);
            }

虽然这似乎根本不影响排序(我什至尝试在下面的代码中的最后一个“if”语句中反转“<”符号,但它根本不会改变排序,导致我相信整个街区都有问题):

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))
                if(serie[j].gjorda < serie[i].gjorda)
                {
                    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);
                }

最佳答案

当你这样做时:

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)

然后交换,你实际上是在说所有这些条件的 && 决定顺序,这对我来说似乎是错误的。

我会创建一个函数 isInOrder,它接受数组指针和两个索引,如果左边的索引在右边的索引之前,则返回 TRUE。然后

if (!isInOrder(serie, i, j)) {
     // swap
}

你的函数是(序列类型为S*):

int isInOrder(S *array, int i, int j) {
    // fill this in. Return 1 if they are in order, 0 if not
}

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

关于c - 为什么这些排序标准之一起作用,而另一个不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480965/

相关文章:

c - 超线程代码示例

java - 如何根据以前的选择顺序对购物 list 进行排序?

algorithm - 将在 O(n) 时间内对 n 个不同的整数进行排序的排序算法

swift - 在下面的 Swift 代码中,为什么程序在到达 Break 时退出 while 循环?

javascript - 嵌套循环的问题

c - 在字符串中的 "E"之后插入 "T",不使用 "T"回火

c - 使用异步套接字在 C 应用程序中实现加密

java - 在java中,排序时,当我有相同的值时,特定问题的解决方案是什么

c++ - 在 For 循环中使用 {} 且不使用 {} 的 If 语句

c - 如何使用 C 中的地址修改分配的内存?