【问题标题】:Why does one of these sorting criterias work, but not the other?为什么这些排序标准中的一个有效,而另一个无效?
【发布时间】:2017-04-18 19:48:32
【问题描述】:

我正在开发一个程序的一部分,该程序按多个标准对数组中的帖子进行排序。在程序到达最后一段代码之前,帖子的排序很好。

此代码块按应有的方式对帖子进行排序:

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

【问题讨论】:

  • serie[j].gjorda - serie[j].inslapptaserie[i].gjorda - serie[i].inslappta 这样的减法是否会溢出?
  • 您应该显示结构定义。 namn 成员的定义方式可能很重要。 If 可能是一个数组 (char namn[30];) 或一个指针 (char *namn;),或者您可能有创造力并做了其他事情。有了指针,就不用担心存储空间了;使用你没有的数组。你应该看看你是否也可以使用结构赋值。
  • 交换很复杂。建议temp = serie[i]; serie[i] = serie[j]; serie[j] = temp;
  • 您正在应用不同的排序标准,因此结果可能会有所不同。领先的平等条件是不寻常的。这意味着如果比较记录的poang 元素不同,则这些记录永远不需要交换;它们已经按顺序排列。也许你应该展示一些样本数据,以及实际和预期的结果?请阅读有关如何创建 MCVE (minimal reproducible example) 的信息 — 虽然您已最小化代码,但您尚未提供完整示例,也未显示数据。
  • 为什么不用内置的qsort()函数?

标签: c sorting for-loop if-statement


【解决方案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)

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

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

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

你的函数是(serie的类型为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,则顺序永远不会改变。

【讨论】:

  • 您能否改写“您实际上是在说所有这些条件的 &&”?我不知道该怎么做
  • @JakobEklund:交换仅发生在 (1) (serie[j].poang == serie[i].poang) (2) ((serie[j].gjorda - serie[j].inslappta) &lt; (serie[i].gjorda - serie[i].inslappta)) (3) (serie[j].gjorda &lt; serie[i].gjorda) .如果其中任何一个条件为假,则不交换。
  • @JonathanLeffler 哦,我知道我现在哪里出错了,解决了。感谢所有评论的人!
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多