Izbassar Tolegen
Izbassar Tolegen

Reputation: 2152

How to pass ordering to scala.util.Sorting.quickSort

I'm trying to pass reverse ordering to the scala.util.Sorting.quickSort with this code:

val a = Array(3, 5, 1, 2)
scala.util.Sorting.quickSort(a)(Ordering.Int.reverse)

It doesn't work saying that:

Error: Unit does not take parameters

However, the code like that works:

val a = Array(3, 5, 1, 2)
a.sorted(Ordering.Int.reverse)

I don't understand why the quickSort example doesn't work? The Ordering.Int.reverse produce Ordering[Int] and according to documentation, the quickSort accepts it implicitly.

I'm running with Scala 2.12.7.

Upvotes: 3

Views: 589

Answers (2)

jrook
jrook

Reputation: 3519

Expanding on Yuval Itzchakov's comment, here is the source code for scala.util.Sorting.quickSort:

def quickSort(a: Array[Int]): Unit = java.util.Arrays.sort(a)

A few lines down, another overloaded quicksort is defined as:

def quickSort[K: Ordering](a: Array[K]): Unit = {...

You mean to use this latter one. But when you call quickSort, the compiler is picking the first one which does not accept an Ordering in its parameter list so it complains about extra parameters. You will need to specify type parameter if you are using Int, Double, or Float as explained here. To summarize:

val a : Array[Int] = Array(3, 5, 1, 2)
val b = Array(3L, 5L, 1L, 2L)  //Longs do not have this problem!
scala.util.Sorting.quickSort[Int](a)(Ordering.Int.reverse)
scala.util.Sorting.quickSort(b)(Ordering.Long.reverse)
println(a.toList)
println(b.toList)

List(5, 3, 2, 1)
List(5, 3, 2, 1)

Upvotes: 3

Simonluca Landi
Simonluca Landi

Reputation: 921

According to documentation the signature of method that uses Ordering is:

def quickSort[K](a: Array[K])(implicit arg0: math.Ordering[K]): Unit

Sort array a with quicksort, using the Ordering on its elements. This algorithm sorts in place, so no additional memory is used aside from what might be required to box individual elements during comparison.

try this:

scala> val a = Array(3, 5, 1, 2)
a: Array[Int] = Array(3, 5, 1, 2)

scala> scala.util.Sorting.quickSort(a)(Ordering.Int.reverse)
<console>:13: error: Unit does not take parameters
       scala.util.Sorting.quickSort(a)(Ordering.Int.reverse)
                                      ^

scala> scala.util.Sorting.quickSort[Int](a)(Ordering[Int].reverse)

scala> a
res2: Array[Int] = Array(5, 3, 2, 1)

Upvotes: 1

Related Questions