[关闭]
@student2018 2018-10-19T03:04:13.000000Z 字数 1136 阅读 650

Scala 快排

Scala


基本思想:经过一趟排序,把待排对象分成两个独立的部分,一部分的数据大(小)于另一部分,同理,对子对象进行如此处理,以达到所有数据都有序。

  1. package student.scala
  2. object Sort extends App {
  3. def quicksort[T <% Ordered[T]](xs:List[T]):List[T] = {
  4. if(xs.length <= 1 ) xs
  5. else {
  6. quicksort ( xs filter (xs(0) >) ) :::
  7. (xs filter (xs(0) ==) ) :::
  8. quicksort ( xs filter (xs(0) <) )
  9. }
  10. }
  11. val rand = scala.util.Random
  12. val oriData = for(i <- 1 to 100) yield rand.nextInt(1000)
  13. oriData map (_ + " ") foreach print
  14. println
  15. quicksort(oriData.toList) map ( _ + " ") foreach print
  16. }

下面是优化版的快排,可以接受更多的类型进行排序,而且返回值与传入值对应。

  1. package student.scala
  2. import scala.collection.SeqLike
  3. import scala.collection.generic.CanBuildFrom
  4. object Sort extends App {
  5. def quicksort[T <% Ordered[T]](xs: List[T]): List[T] = {
  6. if (xs.length <= 1) xs
  7. else {
  8. quicksort(xs filter (xs(0) >)) :::
  9. (xs filter (xs(0) ==)) :::
  10. quicksort(xs filter (xs(0) <))
  11. }
  12. }
  13. def sort[T, Coll](xs: Coll)(implicit
  14. ev0: Coll <:< SeqLike[T, Coll],
  15. n: Ordering[T],
  16. cbf: CanBuildFrom[Coll, T, Coll]): Coll = {
  17. if (xs.length < 2) xs
  18. else {
  19. import n._
  20. val b = cbf()
  21. val pivot = xs.head
  22. b ++= sort(xs filter (pivot >))
  23. b ++= xs filter (pivot ==)
  24. b ++= sort(xs filter (pivot <))
  25. b.result
  26. }
  27. }
  28. val rand = scala.util.Random
  29. val list = for (i <- 1 to 10) yield rand.nextInt(100)
  30. val oriData = list
  31. oriData map (_ + " ") foreach print
  32. println
  33. sort(oriData) map (_ + " ") foreach print
  34. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注