使用erlang實現的quicksort

最近erlang開始變得流行起來,一下是一個erlang中的quicksort的代碼。
  1. %% Author: ztl
  2. %% Created: Nov 26, 2008
  3. %% Description: TODO: Add description to mylib
  4. -module(mylib).
  5. %%
  6. %% Include files
  7. %%
  8. %%
  9. %% Exported Functions
  10. %%
  11. -export([qsort/1]).
  12. %%
  13. %% API Functions
  14. %%
  15. qsort([]) -> [];
  16. qsort([Pivot|T]) ->
  17. qsort([X || X <- T, X < Pivot])
  18. ++ [Pivot] ++
  19. qsort([X || X <- T, X >= Pivot]).
  20. %%
  21. %% Local Functions
  22. %%
調用方法是:
(test@ibm-f618075b95a)1> L=[23,6,2,9,27,400,78,45,61,82,14].
[23,6,2,9,27,400,78,45,61,82,14]
(test@ibm-f618075b95a)2> mylib:qsort(L).
[2,6,9,14,23,27,45,61,78,82,400]

稍微解釋一下這段代碼,關鍵部分是這一段
  1. qsort([]) -> [];
  2. qsort([Pivot|T]) ->
  3. qsort([X || X <- T, X < Pivot])
  4. ++ [Pivot] ++
  5. qsort([X || X <- T, X >= Pivot]).
這是一個函數,注意,句號表示函數的結尾。“->” 後面直到分號或者句號之前的代碼,表示這個函數所執行的過程。第一句"qsort([]) -> [];"最後有一個分號。在erlang中,對於不同模式的輸入參數,函數可以選擇相應的方式處理,在這段代碼中,如果輸入的是一個空的列表,則直接返回空列表(就是代碼第一句話的作用處理),如果不是,則執行
  1. qsort([Pivot|T]) ->
  2. qsort([X || X <- T, X < Pivot])
  3. ++ [Pivot] ++
  4. qsort([X || X <- T, X >= Pivot]).
在來解釋一下[...],[...]表示列表,比如:
 L=[23,6,2,9,27,400,78,45,61,82,14].
[]表示空的列表。

代碼裏有這樣一段:
qsort([Pivot|T])
這個表示,qsort接受一個列表作爲參數(不能爲空),且將列表的第一個元素賦值給變量Pivot,剩下的元素輔助給變量T。
順便提一句,erlang中的變量在賦值後,是不能改變的。

在來解釋一下代碼中的這句
  1. qsort([X || X <- T, X < Pivot]
這裏就是遞歸調用,在qsort函數中再次調用qsort函數
[X || X <- T, X < Pivot]這樣形式的代碼,表示取出在T中,符合小於Pivot條件的元素組成列表X,

在分析一下整個代碼,發現erlang寫出的quicksort原來如此輕巧。令人讚歎。(當然,erlang的正真優勢在於並行處理能力)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章