0
object QuickSort {
  def main(args: Array[String]) = {
    val a = Array(5, 3, 2, 1, 20, 46, 9, 39 ,219)
    sort(a).foreach(n=> (print(n), print (" " )))
  }

  def sort(a:Array[Int]): Array[Int] =  {
    if (a.length < 2) a
    else {
      val pivot = a(a.length / 2)
      sort (a filter (pivot>)) ++ (a filter (pivot == )) ++
        sort (a filter(pivot <))
    }
  }
}

まず、Scalaのさまざまな並べ替えアルゴリズムを説明する割り当てを行っています。私はScalaに比較的慣れていません。私はすでに別の投稿を残しました、そして私は答えられました、そしてそれは私を助けました。私の問題はこれらの3行にあります:sortメソッドのこれらの2行(フィルター、++および==の使用を理解できません)

sort (a filter (pivot>)) ++ (a filter (pivot == )) ++
 sort (a filter(pivot <))

そしてmainメソッドのこの行(nのユーザーとforeachという用語を理解できません)

sort(a).foreach(n=> (print(n), print (" " )))

私はこれらの問題をグーグルで検索しようとしましたが、助けが得られませんでした。返信をいただければ幸いです、

ありがとうございました

4

1 に答える 1

2

これは関数型プログラミング スタイルで記述されており、filter と foreach は高階関数です。つまり、別の関数を入力として受け取ります。

メイン関数の一部は、次のn => (print ... )ような無名関数のシンタックス シュガーです。

def someName(n : String) = (print ...)

次にforeach、この関数をリストのすべての引数に順番に適用します。でそれを書く短い方法は、コンパイラが引数でなければならないことを自動的に導出するため、引数を入力する必要があるだけでなく、n => ...節約できることに注意してください。def someNamenString

同様に、pivot >pivot <、およびpivot ==は、次の形式の関数を記述するためのシンタックス シュガーにすぎません。

def gt(arg : String) = pivot > arg

もう一度、filterこの関数をリストの各引数に適用し、これらの引数から結果リストを作成します。この関数は、 を返しますtrue

つまり、(a filter (pivot>))次のことを行います: list の要素が要素とa比較され、ピボット要素より小さいすべての要素のリストが返されます。pivota filter (pivot>)a

Scala REPL からの簡単な例:

scala> List(1,2,3,4,5) filter (3>)
res0: List[Int] = List(1, 2)

クイックソートがどのように機能するかを知っていると思います。したがって、このパズルのピースを一緒に配置するために必要なのは++、 がリストを連結することを知ることだけです。そのため、これらの行で従来のクイックソートを実行します。つまり、ピボットよりも小さい要素をソートし、要素をピボットし、ピボットよりも大きい並べ替えられた要素を追加します。

于 2013-01-09T06:37:58.640 に答える