Erlang 中的冒泡排序

冒泡排序非常无聊,但是如果您尝试用电信的函数式语言来实现它,它就会变得更有趣——埃尔兰。

我们有一个数字列表,我们需要对其进行排序。冒泡排序算法遍历整个列表,逐对迭代和比较数字。在检查过程中,会发生以下情况:将较小的数字添加到输出列表中,或者在当前列表中交换数字;如果右侧的数字较小,则继续搜索迭代中的下一个数字。重复此遍历,直到列表中不再有替换为止。

实际上,由于该算法的时间复杂度很高,因此不值得使用。 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