Scala中的通用快速排序

时间:2010-02-22 21:54:01

标签: algorithm scala

我最近一直在玩Scala并且正在考虑如何在其中实现一个通用版本的quicksort(只是为了更好地感受语言)

我想出了类似的东西

object Main {
  def qs[T](a: List[T], f: (T, T) => Boolean): List[T] = { 
    if (a == Nil) return a
    val (l, g) = a drop 1 partition (f(a(0),(_:T)))
    qs(l, f) ::: List(a(0)) ::: qs(g, f)
  }

  def main(args: Array[String]): Unit = { 
    val a = List(5,3,2,1,7,8,9,4,6)
    val qsInt = qs(_: List[Int], (_: Int) > (_: Int))
    println(qsInt(a))
  }

}

这不像我想要的那样通用,因为我必须明确说明如何订购元素而不是像

那样做
val (l, g) = a drop 1 partition (a(0) >)

如何告诉编译器T只需要实现大于运算符,可以通过这个函数进行排序?

此致

2 个答案:

答案 0 :(得分:14)

def qsort[T <% Ordered[T]](list: List[T]): List[T] = {
  list match {
  case Nil => Nil     
  case x::xs =>        
    val (before, after) = xs partition (_ < x)
    qsort(before) ++ (x :: qsort(after))
  }
}

答案 1 :(得分:8)

Roger covered Ordered案件以来,让我了解Ordering

def qsort[T](list: List[T])(implicit ord: Ordering[T]): List[T] = list match {
  // import ord._ // enables "_ < x" syntax
  case Nil => Nil
  case x :: xs =>
    val (before, after) = xs partition (ord.lt(_, x))
    qsort(before) ::: x :: qsort(after)
}

使用Ordering有两个主要优点:

  1. T类型不需要创建为Ordered
  2. 可以轻松提供备用排序。
  3. 例如,在Scala 2.8上:

    def sortIgnoreCase(strs: List[String]) = {
      val myOrdering = Ordering.fromLessThan { (x: String, y: String) => 
        x.toLowerCase < y.toLowerCase
      }
      qsort(strs)(myOrdering)
    }