2013-01-09 39 views
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中解釋各種排序算法。我對斯卡拉來說比較新。我已經離開了另一個帖子,我回答了,它幫助了我。我的問題是與這些3行: 這些2條線路中的排序方法(I不能瞭解使用過濾器的,++和==)斯卡拉快速排序

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

和這條線在主方法(I無法理解的n的用戶和術語foreach)

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

我試着用谷歌搜索這些問題,但沒有得到任何幫助。 將不勝感激的答覆,

謝謝

+0

請檢查[Scala標準庫API](http://www.scala-lang.org/api/current/index.html#scala.Array)中關鍵字的含義,並且[this](http: //www.scala-lang.org/node/133)來解釋匿名函數,這就是'bla = bla'的含義。 –

+0

我會盡力謝謝你:D –

+0

不客氣。 'pivot <'的語法對我來說是新的,但它可能也是匿名函數的風格 –

回答

2

這是寫在一個函數式編程風格,其中過濾器和foreach是高階函數,即他們採取另一種功能作爲輸入。

在主函數中的部分與n => (print ...)是一個匿名函數,它看起來像這樣的語法糖:

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

反過來foreach適用此功能依次列表的每個參數。請注意,使用n => ...編寫它的簡短方式允許您保存def someName以及輸入參數n,因爲編譯器會自動推導出它必須是String參數。

同樣,pivot >pivot <pivot ==都只是形式

def gt(arg : String) = pivot > arg 

再一次書寫功能語法糖,filter適用此功能列表的每個參數,並建立從這些結果列表參數,爲此函數返回true

換句話說,(a filter (pivot>))執行以下操作:列表a的元件抵靠pivot元件相比,和a filter (pivot>)然後返回比所述樞轉元件的較小的所有a元素列表。

從斯卡拉REPL一個簡單的例子:

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

我假設你知道如何工作的快速排序,所以你現在需要這個謎題的碎片放在一起是要知道++符連接列表,讓你在這些行中執行傳統的快速排序:排序比主元更小的元素,添加主元素並添加大於主元的排序元素。