【问题标题】:Sorting a list containing NaNs对包含 NaN 的列表进行排序
【发布时间】:2015-04-06 15:02:08
【问题描述】:

如果我有一个浮点数列表,其中包含:Infinity、-Infinity、其他随机十进制数和一个 NaN。列表排序后 NaN 应该在哪里?如果有帮助,我正在使用冒泡排序

【问题讨论】:

  • 欢迎来到 Stack Overflow。这不是在这里提出问题的好方法。到目前为止,您是否尝试过任何方法来解决您的问题?首先展示你的努力,这样人们才能展示他们的努力。请先阅读FAQHow to Askhelp center
  • 没有问题要解决,这是一个问题,在寻求答案
  • 什么语言? Java 有一个简单的答案。

标签: list sorting floating-point nan


【解决方案1】:

不能使用<= 作为比较对包括NaN 在内的浮点值列表进行排序,因为<= 不是包括NaN 在内的浮点值的顺序:它不是自反的(NaN <= NaN 必须保持 <= 是自反的。它没有)。

您打破了排序算法的先决条件。任何事情都有可能发生。

【讨论】:

    【解决方案2】:

    为了排序,您需要一个一致的顺序,这意味着,例如,为 NaN 制定一个排序规则。

    幸运的是,这项工作已经用 Java 完成了。 java.lang.DoubleComparable,其compareTo 使用扩展规则,包括“此方法认为Double.NaN 等于其自身并且大于所有其他双精度值(包括Double.POSITIVE_INFINITY)。”

    它还有一个compare 方法,该方法使用这些扩展规则而不是<= 等规则比较两个双原语。

    如果您使用 Java 编程,您可以直接在您的排序中使用它。如果您使用的是float而不是double,请参见java.lang.Float中的对应方法。如果您使用其他语言进行编程,您仍然可以从 Java 中读取和复制规则,并在比较函数中使用它们。

    如果您在排序中使用它,您应该期望 NaN 位于排序列表的最后,毕竟是有限值和正无穷大。

    【讨论】:

    【解决方案3】:

    NaN 将被放置在排序数组的开头或结尾,具体取决于相关冒泡排序的实现。

    这完全取决于您如何定义订购标准。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2010-10-29
      • 1970-01-01
      • 2011-07-04
      • 2013-07-07
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多