使用erlang实现的quicksort
2008-11-26 14:11
232 查看
最近erlang开始变得流行起来,一下是一个erlang中的quicksort的代码。
%% Author: ztl
%% Created: Nov 26, 2008
%% Description: TODO: Add description to mylib
-module(mylib).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([qsort/1]).
%%
%% API Functions
%%
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
qsort([X || X <- T, X >= Pivot]).
%%
%% Local Functions
%%
调用方法是:
(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]
稍微解释一下这段代码,关键部分是这一段
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
qsort([X || X <- T, X >= Pivot]).
这是一个函数,注意,句号表示函数的结尾。“->” 后面直到分号或者句号之前的代码,表示这个函数所执行的过程。第一句"qsort([]) -> [];"最后有一个分号。在erlang中,对于不同模式的输入参数,函数可以选择相应的方式处理,在这段代码中,如果输入的是一个空的列表,则直接返回空列表(就是代码第一句话的作用处理),如果不是,则执行
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
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中的变量在赋值后,是不能改变的。
在来解释一下代码中的这句
qsort([X || X <- T, X < Pivot]
这里就是递归调用,在qsort函数中再次调用qsort函数
[X || X <- T, X < Pivot]这样形式的代码,表示取出在T中,符合小于Pivot条件的元素组成列表X,
在分析一下整个代码,发现erlang写出的quicksort原来如此轻巧。令人赞叹。(当然,erlang的正真优势在于并行处理能力)
%% Author: ztl
%% Created: Nov 26, 2008
%% Description: TODO: Add description to mylib
-module(mylib).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([qsort/1]).
%%
%% API Functions
%%
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
qsort([X || X <- T, X >= Pivot]).
%%
%% Local Functions
%%
调用方法是:
(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]
稍微解释一下这段代码,关键部分是这一段
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
qsort([X || X <- T, X >= Pivot]).
这是一个函数,注意,句号表示函数的结尾。“->” 后面直到分号或者句号之前的代码,表示这个函数所执行的过程。第一句"qsort([]) -> [];"最后有一个分号。在erlang中,对于不同模式的输入参数,函数可以选择相应的方式处理,在这段代码中,如果输入的是一个空的列表,则直接返回空列表(就是代码第一句话的作用处理),如果不是,则执行
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
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中的变量在赋值后,是不能改变的。
在来解释一下代码中的这句
qsort([X || X <- T, X < Pivot]
这里就是递归调用,在qsort函数中再次调用qsort函数
[X || X <- T, X < Pivot]这样形式的代码,表示取出在T中,符合小于Pivot条件的元素组成列表X,
在分析一下整个代码,发现erlang写出的quicksort原来如此轻巧。令人赞叹。(当然,erlang的正真优势在于并行处理能力)
相关文章推荐
- 使用erlang实现P2P磁力搜索-实现
- 使用erlang实现P2P磁力搜索-实现
- 使用erlang实现简单的http性能测试工具,替代loadrunner、loadspace
- 使用Erlang、C和Lisp实现的BigData解决海量移动数据
- 《FreeSWITCH: VoIP实战》: 使用Erlang建立IVR实现复杂业务逻辑
- 使用分布式实现N皇后问题 erlang语言实现
- 使用callback实现自定义的erlang行为模式
- 使用erlang实现简单的二进制通信协议
- erlang使用gen_server实现质数服务器(手打代码,还debug了几个错误)
- 使用Java泛型实现快速排序(快排,Quicksort)
- 使用JS播放声音/音乐的实现方法
- 使用Hudson与JsTestDriver实现的Javascript持续集成
- 使用xmlhttp 实现多文件上传
- 使用segue时实现login的判断,判断正确了才切换到下个视图
- 使用每步动态域名解析ddns实现ftp
- oracle使用substr instr实现类似于java substring的功能
- 使用宏定义,简单实现jni函数命名
- 使用Cisco Network Assistant实现快速配置_思科认证指导/认证技巧与心得
- HierarchyView的实现原理和Android设备无法使用HierarchyView的解决方法
- 02-使用委托与多线程实现窗体间传值