冒泡排序非常无聊,但是如果您尝试用电信的函数式语言来实现它,它就会变得更有趣——埃尔兰。
我们有一个数字列表,我们需要对其进行排序。冒泡排序算法遍历整个列表,逐对迭代和比较数字。在检查过程中,会发生以下情况:将较小的数字添加到输出列表中,或者在当前列表中交换数字;如果右侧的数字较小,则继续搜索迭代中的下一个数字。重复此遍历,直到列表中不再有替换为止。
实际上,由于该算法的时间复杂度很高,因此不值得使用。 O(n^2);我在 Erlang 中以命令式的方式实现了它,但如果你有兴趣,你可以寻找更好的选择:
-module(bubbleSort).
-export([main/1]).
startBubbleSort([CurrentHead|Tail]) ->
compareHeads(CurrentHead, Tail, [], [CurrentHead|Tail]).
compareHeads(CurrentHead, [NextHead|Tail], [], OriginalList) ->
if
CurrentHead < NextHead ->
compareHeads(NextHead, Tail, [CurrentHead], OriginalList);
true ->
compareHeads(CurrentHead, Tail, [NextHead], OriginalList)
end;
compareHeads(CurrentHead, [NextHead|Tail], OriginalOutputList, OriginalList) ->
if
CurrentHead < NextHead ->
OutputList = OriginalOutputList ++ [CurrentHead],
compareHeads(NextHead, Tail, OutputList, OriginalList);
true ->
OutputList = OriginalOutputList ++ [NextHead],
compareHeads(CurrentHead, Tail, OutputList, OriginalList)
end;
compareHeads(CurrentHead, [], OriginalOutputList, OriginalList) ->
OutputList = OriginalOutputList ++ [CurrentHead],
if
OriginalList == OutputList ->
io:format("OutputList: ~w~n", [OutputList]);
true ->
startBubbleSort(OutputList)
end.
main(_) ->
UnsortedList = [69,7,4,44,2,9,10,6,26,1],
startBubbleSort(UnsortedList).
安装和启动
在 Ubuntu 中,Erlang 的安装非常简单;只需在终端中输入 sudo apt install erlang 即可。在这种语言中,每个文件必须是一个模块,具有可以外部使用的函数列表——出口。该语言的有趣特征包括没有变量,只有常量,没有 OOP 标准语法(这并不妨碍 OOP 技术的使用),当然还有基于参与者模型的无锁并行计算。
您可以通过交互式 erl 控制台运行该模块,一个接一个地运行命令,或者更简单地通过 escript bubbleSort.erl 运行该模块;对于不同的情况,文件看起来会有所不同,例如,对于 escript,您需要创建一个主函数来启动它。
来源
https://www.erlang.org/
https://habr.com/ru/post/197364/
源代码
https://gitlab.com/ demensdeum/algorithms/blob/master/bubbleSort/bubbleSort.erl