Guest User

Untitled

a guest
Jul 16th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. this gist demonstrates idiomatic way to do sorting of various kinds through functional programming
  2.  
  3. ```scala
  4. import scala.math.Ordering
  5. import scala.util.control.TailCalls._
  6.  
  7. trait Sort {
  8. def sort[O: Ordering](xs: List[O]): List[O]
  9. def safeSort[O: Ordering](xs: List[O]): List[O]
  10. }
  11.  
  12. class InsertionSort extends Sort {
  13. def sort[O](ls: List[O])(implicit Ord: Ordering[O]): List[O] = {
  14. def insert(x: O, xs: List[O]): List[O] =
  15. xs match {
  16. case Nil => List(x)
  17. case y :: ys =>
  18. if (Ord.compare(x, y) < 0) x :: y :: ys
  19. else y :: insert(x, ys)
  20. }
  21.  
  22. ls match {
  23. case Nil => Nil
  24. case x :: xs => insert(x, sort(xs))
  25. }
  26. }
  27.  
  28. private def isort[O](ls: List[O])(implicit Ord: Ordering[O]): TailRec[List[O]] = {
  29. def insert(x: O, xs: List[O]): TailRec[List[O]] =
  30. xs match {
  31. case Nil => done(List(x))
  32. case y :: ys =>
  33. if (Ord.compare(x, y) < 0) done(x :: y :: ys)
  34. else insert(x, ys).map(y :: _)
  35. }
  36.  
  37. ls match {
  38. case Nil => done(Nil)
  39. case x :: xs =>
  40. isort(xs).flatMap(insert(x, _))
  41. }
  42. }
  43.  
  44. override def safeSort[O: Ordering](xs: List[O]): List[O] = isort(xs).result
  45. }
  46.  
  47. class SelectionSort extends Sort {
  48. def sort[O](ls: List[O])(implicit Ord: Ordering[O]): List[O] = {
  49. def select(xs: List[O]): (O, List[O]) =
  50. xs match {
  51. case Nil => throw new RuntimeException("not possible")
  52. case x :: Nil => (x, Nil)
  53. case y :: ys =>
  54. val (z, zs) = select(ys)
  55. if (Ord.compare(y, z) < 0) (y, z :: zs)
  56. else (z, y :: zs)
  57. }
  58.  
  59. ls match {
  60. case Nil => Nil
  61. case _ =>
  62. val (x, xs) = select(ls)
  63. x :: sort(xs)
  64. }
  65. }
  66.  
  67. private def isort[O](ls: List[O])(implicit Ord: Ordering[O]): TailRec[List[O]] = {
  68. def select(xs: List[O]): TailRec[(O, List[O])] =
  69. xs match {
  70. case Nil => throw new RuntimeException("not possible")
  71. case x :: Nil => done((x, Nil))
  72. case y :: ys =>
  73. select(ys) map { case (z, zs) =>
  74. if (Ord.compare(y, z) < 0) (y, z :: zs)
  75. else (z, y :: zs)
  76. }
  77. }
  78.  
  79. ls match {
  80. case Nil => done(Nil)
  81. case _ =>
  82. select(ls).flatMap { case (x, xs) =>
  83. isort(xs).map(x :: _)
  84. }
  85. }
  86. }
  87.  
  88. override def safeSort[O: Ordering](xs: List[O]): List[O] = isort(xs).result
  89. }
  90. ```
Add Comment
Please, Sign In to add comment