Classificação por bolha em Erlang

Bubble sort é um tanto chato, mas se torna mais interessante se você tentar implementá-lo em uma linguagem funcional para telecomunicações. Erlang.

Temos uma lista de números, precisamos classificá-la. O algoritmo de classificação por bolha percorre toda a lista, iterando e comparando os números aos pares. Durante a verificação, acontece o seguinte: um número menor é adicionado à lista de saída, ou os números são trocados na lista atual, se houver menos à direita, a pesquisa continua com o próximo número na iteração; Este percurso é repetido até que não haja mais substituições na lista.

Na prática não vale a pena utilizar devido à alta complexidade de tempo do algoritmo – O(n^2); Implementei em Erlang, no estilo imperativo, mas se tiver interesse pode procurar opções melhores:

-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).

Instalação e inicialização

No Ubuntu, Erlang é muito fácil de instalar; basta digitar sudo apt install erlang no terminal. Nesta linguagem, cada arquivo deve ser um módulo, com uma lista de funções que podem ser utilizadas externamente – – exportar. Características interessantes da linguagem incluem a ausência de variáveis, apenas constantes, a ausência de uma sintaxe padrão para POO (o que não impede o uso de técnicas de POO) e, claro, cálculos paralelos sem bloqueios baseados no modelo de ator.

Você pode executar o módulo através do console erl interativo, executando um comando após o outro, ou mais simplesmente através de escript bubbleSort.erl; Para casos diferentes, o arquivo terá uma aparência diferente, por exemplo, para escript você precisa criar uma função principal a partir da qual ele será iniciado.

Fontes

https://www.erlang.org/
https://habr.com/ru/post/197364/

Código fonte

https://gitlab.com/ demensdeum/algorithms/blob/master/bubbleSort/bubbleSort.erl