Scala 說說快速排序

2021-08-26 04:49:09 字數 1103 閱讀 1004

簡短的幾行**就完成了快速排序:

def qsort: list[int] => list[int] =

這幾行**很美,美不勝收。

我喜歡把這種風格裡定義的sqort叫做物件,函式物件;

它的型別是list[int] => list[int],這是個函式型別,接受乙個list[int]引數,返回乙個list[int] 結果;

模式匹配的第二個case pivot :: tail用來匹配至少有乙個元素的list,如果匹配,pivot(軸)將被賦值為第乙個元素;

val (smaller, rest) = tail.partition(_ < pivot)

這行**很強大,partition為高階函式,接受乙個返回值為布林值的函式。_ < pivot 為語法糖,是(i:int)=>i這裡的partition返回乙個二元組(list[int],list[int]),smaller包含所有小於pivot的元素,rest包含tail中所有大於等於pivot的元素。

qsort(smaller) ::: pivot :: qsort(rest),這行**很直觀,雖然執行順序有點拗;

直觀的地方在於書寫的順序,小的在前大的在後,然後用:::和::符號鏈結起來;

執行的時候是qsort(rest).::(pivot),就是把pivot放在qsort(rest)的結果(是個list)的首位;

用括號表示優先順序:(qsort(smaller) ::: (pivot :: qsort(rest)))

完全寫法:(qsort(rest).::(pivot)).:::(qsort(smaller)) 這裡的::和:::都是方法,還是簡寫好,形象直觀,也是最終結果的表現形式。

qsort(smaller) ::: pivot :: qsort(rest) 這行**很不容易理解,怎麼qsort還沒有定義完就能呼叫了?這是我第一次接觸遞迴的困惑。

假設qsort已經在別的地方定義完,在這裡呼叫,則很容易理解;qsort在自己定義的地方呼叫自己,則顯得很抽象,彷彿一口不見底的井。

我是這樣理解,定義乙個規則來把乙個集合處理為prepart和nextpart兩部分,然後把這個規則分別應用在這兩部分上。

Scala快速排序演算法解析

一 源 def sort ls list int list int 二 演算法的核心 1 快速排序事先選取乙個元素作為用來比較的基準。比基準大的數放在右邊,比基準小的數放在左邊,一次分成大 小兩類。2 每一類又通過選取乙個基準再次進行大小的分類。直到左右兩邊沒有資料為止。三 遞迴的解釋 理解遞迴的關...

快速排序 基於scala實現

快速排序由於排序效率在同為o n logn 的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想 分治法也確實實用.快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 該方法的基本思想...

用scala實現快速排序

author 孤星魅影 乙個簡單的整型陣列快速排序 scala大部分符號都是左結合,只有 的連線符是右結合,a b c 相當於a b c 它會優先執行冒號右邊的表示式。def sortint arr array int array int 乙個完整的快速排序的方法 可以傳入任意型別的buffer對其...