`
standalone
  • 浏览: 613156 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

erlang程序解释:冒泡排序

阅读更多
原code参见http://en.literateprograms.org/Bubble_sort_(Erlang)

虽然原文有解释,可能还是不太好理解erlang写得这么间断晦涩的程序。

 1 % Copyright (c) 2012 the authors listed at the following URL, and/or
 2 % the authors of referenced articles or incorporated external code:
 3 % http://en.literateprograms.org/Bubble_sort_(Erlang)?action=history&offset=20080418062156
 4 % 
 5 % Permission is hereby granted, free of charge, to any person obtaining
 6 % a copy of this software and associated documentation files (the
 7 % "Software"), to deal in the Software without restriction, including
 8 % without limitation the rights to use, copy, modify, merge, publish,
 9 % distribute, sublicense, and/or sell copies of the Software, and to
10 % permit persons to whom the Software is furnished to do so, subject to
11 % the following conditions:
12 % 
13 % The above copyright notice and this permission notice shall be
14 % included in all copies or substantial portions of the Software.
15 % 
16 % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 % IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20 % CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 % TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 % SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 % 
24 % Retrieved from: http://en.literateprograms.org/Bubble_sort_(Erlang)?oldid=13141
25 
26 -module(bubblesort).
27 -export([sort/1]).
28 -import(lists, [reverse/1]).
29 
30 sort(L) -> sort(L, [], true).
31 
32 sort([], L, true) -> reverse(L);
33 
34 sort([], L, false) -> sort(reverse(L), [], true);
35 sort([ X, Y | T ], L, _) when X > Y ->
36     sort([ X | T ], [ Y | L ], false);
37 sort([ X | T ], L, Halt) -> sort(T, [ X | L ], Halt).


我们先看一个例子吧:


sort([2,4,3,5,1])

#round 1

=> sort([2,4,3,5,1], [], true)

=> sort([4,3,5,1], [2], true)

=> sort([4,5,1], [3,2], false)

=> sort([5,1], [4,3,2], false)

=> sort([5], [1,4,3,2], false)

=> sort([], [5,1,4,3,2], false)

=> sort([2,3,4,1,5], [], true)

# round 2

=> sort([3,4,1,5], [2], true)

=> sort([4,1,5], [3,2], true)

=> sort([4,5], [1,3,2], false)

=> sort([5], [4,1,3,2], false)

=> sort([], [5,4,1,3,2], false)

=> sort([2,3,1,4,5], [], true)

# round 3

=> sort([3,1,4,5], [2], true)

=> sort([3,4,5], [1,2], false)

=> sort([4,5], [3,1,2], false)

=> sort([5], [4,3,1,2], false)

=> sort([], [5,4,3,1,2], false)

=> sort([2,1,3,4,5], true)

#round 4

=> sort([2,3,4,5], [1], false)

=> sort([3,4,5], [2,1], false)

=> sort([4,5], [3,2,1], false)

=> sort([5], [4,3,2,1], false)

=> sort([], [5,4,3,2,1], false)

=> sort([1,2,3,4,5], [], true)

#round 5

=> sort([2,3,4,5], [1], true)

=> sort([3,4,5],[2,1], true)

=> sort([4,5],[3,2,1], true)

=> sort([5],[4,3,2,1], true)

=> sort([], [5,4,3,2,1], true)

=> [1,2,3,4,5]

冒泡排序的每一轮,都找出了一个最大值沉到队伍的最后面.如果本轮全部是排好序的,也即不需要下一轮了,那么flag就是true,否则是false.
分享到:
评论

相关推荐

    《Erlang之父:为什么面向对象很糟糕》PDF

    《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF

    编写分布式的Erlang程序:陷阱和对策

    ### 编写分布式的Erlang程序:陷阱和对策 #### 摘要与背景 在探讨编写分布式的Erlang程序时,本篇文章聚焦于Erlang编程语言中的分布式特性,尤其是那些容易忽视的陷阱及其对应的解决方案。Erlang作为一种专为构建...

    Windows Erlang语言安装包:otp-win64-25.2.1

    Windows上安装RabbitMQ服务,依赖的Erlang语言安装包:otp_win64_25.2.1.exe 重要:Erlang安装程序必须【以管理员身份运行】,否则RabbitMQ安装程序相关信息不会在注册表项中不存在。

    Erlang程序设计(第2版)1

    【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...

    Erlang程序设计(第二版)及源码

    书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用中至关重要的文件和网络编程、OTP、ETS和DETS等主题。...

    erlang文献及资料汇总

    编写分布式的 Erlang 程序:陷阱和对策 硝烟中的Erlang 深入底层: erlang VM基于多核处理器的可伸缩性特征 erlang VM内部数据共享机制 erlang 消息传递机制 文章地址:...

    Erlang程序设计,包含完整目录和全套源码

    这个压缩包包含了Erlang程序设计的完整目录和源码,是学习和理解Erlang编程的重要资源。 Erlang的并发特性源于其轻量级进程模型,每个进程都有自己的内存空间,进程间通信通过消息传递实现,这种设计降低了并发执行...

    erlang程序设计与入门

    **Erlang程序设计与入门** Erlang是一种并发、函数式编程语言,主要用于构建分布式、高可用性、容错性强的系统。它的设计灵感来源于电信行业的需求,由瑞典爱立信公司于1986年开发。Erlang以其独特的并发模型、轻量...

    Erlang程序设计中文版

    **Erlang程序设计中文版**是一本深入探讨Erlang编程语言的书籍,旨在帮助开发者理解和掌握这种在并发处理和分布式系统中广泛使用的语言。Erlang以其强大的错误恢复能力、热代码替换以及对大规模并发的支持而闻名,是...

    Erlang程序设计 第2版

    Erlang程序设计 第2版 Erlang程序设计 第2版Erlang程序设计 第2版

    erlang程序设计相关例子程序

    通过对这些文件名的分析,我们可以看出这些Erlang程序涵盖了并发处理、进程通信、异常处理、服务器设计、数据处理和测试等多个方面,体现了Erlang在构建分布式系统中的强大功能。学习并理解这些示例,对于深入掌握...

    Erlang程序设计及源代码打包

    **Erlang程序设计概述** Erlang是一种面向并发的、函数式的编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、容错性强的分布式系统。《Erlang程序设计》这本书,作者是Joe Armstrong,他是...

    [Erlang程序设计]源代码

    **Erlang程序设计源代码详解** Erlang是一种面向并发、函数式编程语言,尤其在分布式系统和高可用性领域表现出色。本资源包含了《Erlang程序设计》一书的所有实例代码,旨在帮助读者深入理解Erlang语言的核心特性和...

    Erlang程序设计].源代码

    在"Erlang程序设计"].源代码这个压缩包中,我们可以找到学习和实践Erlang编程的相关材料。这些源代码可能是书中实例的实现,或者是针对Erlang编程技巧和概念的示例。通过阅读和分析这些源代码,你可以深入理解Erlang...

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

    erlang-ffi:与Haskell的Erlang节点通信

    ”程序。 让我们从Haskell代码开始。 在这里,我们使用createSelf初始化ffi,并使用createMBox创建一个邮箱。 然后,我们用pid发送问候语到在Erlang节点erl@127.0.0.1上运行的注册进程p 。 我们希望得到一个答案,...

    xapian-erlang-bindings:用于Erlang的Xapian绑定(GSOC2012项目)

    尝试作为独立的Erlang应用程序: git clone git://github.com/arcusfelis/xapian-erlang-bindings.git xapian cd xapian ./rebar get-deps compile ./start-dev.sh 添加为rebar.config的依赖rebar.config :

    Erlang程序设计及源码

    本资源包含了一本Erlang程序设计的入门经典书籍及其配套源码,适合初学者深入理解Erlang编程。 1. **Erlang简介** Erlang以其强大的并发处理能力而闻名,它采用了轻量级进程模型,使得在单个系统中可以同时运行...

    erlang程序设计(第二版)中文pdf

    erlang 程序设计(第二版) 中文 pdf

Global site tag (gtag.js) - Google Analytics