Skip to content

Instantly share code, notes, and snippets.

@maasg
Created September 8, 2013 14:10
Show Gist options
  • Select an option

  • Save maasg/6484985 to your computer and use it in GitHub Desktop.

Select an option

Save maasg/6484985 to your computer and use it in GitHub Desktop.
MergeSort - classical sort algorithm done as refresh coding exercise
object MergeSort {
def mergeSort[T](list: List[T])(implicit order: Ordering[T]): List[T] = {
def merge[T](l1: List[T], l2: List[T])(implicit order: Ordering[T]): List[T] = {
(l1, l2) match {
case (Nil, Nil) => Nil
case (Nil, l) => l
case (l, Nil) => l
case (x :: tail1, y :: tail2) => if (order.compare(x, y) > 0) y :: merge(l1, tail2) else x :: merge(tail1, l2)
}
}
list match {
case Nil => Nil
case x :: Nil => List(x)
case l =>
val (f, s) = l.splitAt(l.size / 2)
merge(mergeSort(f), mergeSort(s))
}
} //> mergeSort: [T](list: List[T])(implicit order: Ordering[T])List[T]
val l = List(1, 6, 5, 3, 6, 10, 91, 82, 73, 64, 55, 46, 37, 28, 19)
//> l : List[Int] = List(1, 6, 5, 3, 6, 10, 91, 82, 73, 64, 55, 46, 37, 28, 19)
//|
mergeSort(l) //> res0: List[Int] = List(1, 3, 5, 6, 6, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91
//| )
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment