为什么其中一个排序标准有效,而另一个则不然?

时间:2017-04-18 19:48:32

标签: 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”语句中的“&lt;”符号,但它根本不会改变排序,让我相信整个街区都有一些事情发生了):

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);
                }

1 个答案:

答案 0 :(得分:1)

执行此操作时:

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)

然后交换,你实际上是在说&amp;&amp;所有这些条件决定了订单,这对我来说似乎不对。

我会创建一个函数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
}

您原件的主要问题是您没有指定.poang不相等的订单。如果原始数组的.poang具有所有不同的值,那么顺序将永远不会改变。