2.2

Implement isSorted, which checks whether an Array[A] is sorted according to a given comparison function: def isSortedA => Boolean): Boolean

Solution

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
    @annotation.tailrec
    def go(n: Int): Boolean =
      if (n == as.length - 1) ordered(as(n-1), as(n))
      else if (! ordered(as(n-1), as(n))) false
      else go(n + 1)
    if (as.size == 0 || as.size == 1) true
    else go(1)
  }

Run

@ isSorted[Int](Array(1,2,3,4), (a: Int, b: Int) => a <= b)
res18: Boolean = true
@ isSorted[Int](Array(1,2,3,4,1), (a: Int, b: Int) => a <= b)
res19: Boolean = false
@ isSorted[Int](Array(1), (a: Int, b: Int) => a <= b)
res20: Boolean = true
@ isSorted[Int](Array(), (a: Int, b: Int) => a <= b)
res21: Boolean = true
@ isSorted[Int](Array(2,1), (a: Int, b: Int) => a <= b)
res22: Boolean = false
@ isSorted[Int](Array(1,2,3,4,5,6,7,8,9,10), (a: Int, b: Int) => a <= b)
res23: Boolean = true