【问题标题】:Sorting a list containing NaNs对包含 NaN 的列表进行排序
【发布时间】:2015-04-06 15:02:08
【问题描述】:
如果我有一个浮点数列表,其中包含:Infinity、-Infinity、其他随机十进制数和一个 NaN。列表排序后 NaN 应该在哪里?如果有帮助,我正在使用冒泡排序
【问题讨论】:
标签:
list
sorting
floating-point
nan
【解决方案1】:
您不能使用<= 作为比较对包括NaN 在内的浮点值列表进行排序,因为<= 不是包括NaN 在内的浮点值的顺序:它不是自反的(NaN <= NaN 必须保持 <= 是自反的。它没有)。
您打破了排序算法的先决条件。任何事情都有可能发生。
【解决方案2】:
为了排序,您需要一个一致的顺序,这意味着,例如,为 NaN 制定一个排序规则。
幸运的是,这项工作已经用 Java 完成了。 java.lang.Double 是Comparable,其compareTo 使用扩展规则,包括“此方法认为Double.NaN 等于其自身并且大于所有其他双精度值(包括Double.POSITIVE_INFINITY)。”
它还有一个compare 方法,该方法使用这些扩展规则而不是<= 等规则比较两个双原语。
如果您使用 Java 编程,您可以直接在您的排序中使用它。如果您使用的是float而不是double,请参见java.lang.Float中的对应方法。如果您使用其他语言进行编程,您仍然可以从 Java 中读取和复制规则,并在比较函数中使用它们。
如果您在排序中使用它,您应该期望 NaN 位于排序列表的最后,毕竟是有限值和正无穷大。
【解决方案3】:
NaN 将被放置在排序数组的开头或结尾,具体取决于相关冒泡排序的实现。
这完全取决于您如何定义订购标准。