1

我正在尝试使用自定义排序对整数数组进行排序。

例如

quickSort[Int](indices)(Ordering.by[Int, Double](value(_)))

基本上,我试图按特定列的值对行索引进行排序。当我在相当大的数据上运行它时,最终会出现 stackoverflow 错误。如果我使用更直接的方法(例如排序元组),这不是问题。

如果您尝试扩展默认的 Ordering[Int] 是否有问题?

您可以像这样重现:

val indices = (0 to 99999).toArray
val values = Array.fill[Double](100000)(math.random)
scala.util.Sorting.quickSort[Int](indices)(Ordering.by[Int, Double](values(_))) // Works
val values2 = Array.fill[Double](100000)(0.0)
scala.util.Sorting.quickSort[Int](indices)(Ordering.by[Int, Double](values2(_))) // Fails

更新:

我认为我发现了问题所在(正在回答我自己的问题)。通过更改整数的排序定义,我似乎创造了一个自相矛盾的情况。

在快速排序算法本身中,数组位置也是整数,并且有一些比较数组位置的语句。此位置比较应遵循标准整数排序。

但是由于新定义,现在这些位置比较器也遵循索引值比较器,事情变得非常混乱。

我想至少目前,我不应该更改这些默认值类型排序,因为库可能依赖于默认值类型排序。

更新2

事实证明,上述实际上不是问题,并且在与 Ordering 一起使用时 quickSort 存在错误。当定义一个新的 Ordering 时,Ordering 之间的相等运算符是 'equiv',但是 quickSort 使用 '=='。这导致比较索引,而不是比较索引值。

4

0 回答 0