Erlang
- Problema: ordenar lista
ordenar(lista) => lista ordenada
ex: ordenar ([4, 3, 9, 3, 7, 4, 2]) => [2, 3, 3, 4, 4, 7, 9]
- rodar exemplos
- ordenar
([4, 3, 9, 3, 7, 4, 2])
- ordenar([1,2,a,3,4,b,5,6]
- ordenar([])
- outros exemplos
- Idéia da
solução: usar quick sort
ordenar(lista) => lista ordenada
- pegar primeiro elemento da lista: 4
- criar 2 listas e ordená-las:
- elementos menores que o primeiro:
ordenar [ 3, 3, 2] => [2, 3, 3]
- restante dos elementos:
ordenar [9, 7, 4] => [4, 7, 9]
- Concatenar listas:
[2, 3, 3] ++ [4] ++ [4, 7, 9] => [2, 3, 3, 4, 4, 7, 9]
- Função para ordenar:
ordenar([]) -> [];
ordenar([Primeiro|Resto]) ->
ordenar([X|| X <- Resto, X
< Primeiro]) ++ [Primeiro] ++ ordenar([X|| X <-
Resto, X >= Primeiro]).
- Componentes usados
- lista
... ordenar([4, 3, 9, 3, 7, 4, 2]) -> ..
- lista com Resto
... ordenar([Primeiro|Resto]) -> ...
... ordenar([4 | 3, 9, 3, 7, 4, 2]) -> ...
Primeiro = 4
Resto = [3, 9, 3, 7, 4, 2]
- list comprehension
[X|| X <- Resto, X
< Primeiro]
A lista de X tal que X pertence a Resto e X é menor que Primeiro.
[X|| X <- [3, 9, 3, 7, 4, 2], X
< 4]
The list of X such that X is taken from the
list [3,9,3,7,4,2]
and
X is less than 4.
- Função completa para ordenar:
-module(quicksort).
-export([ordenar/1]).
ordenar([]) -> [];
ordenar([Primeiro|Resto]) ->
ordenar([X|| X <- Resto, X
< Primeiro]) ++
[Primeiro] ++
ordenar([X|| X <-
Resto, X >= Primeiro]).
-
"-module(quicksort).": nome do arquivo = quicksort.erl
- "-export([ordenar/1]).":
lista de "função/quantidade de parâmetros"
funções visíveis externamente
- Fazer função:
ordenar lista de forma crescente ou decrescente
ordenar(tipo da ordenação, lista) => lista ordenada
tipo da ordenação:
- c = crescente
- d = decrescente
- Avaliar solução
-module(quicksort2).
-export([ordenar/1, ordenar/2]).
ordenar(Lista) -> ordenar(c,Lista).
ordenar(_,[]) -> [];
ordenar(c,[Primeiro|Resto]) -> ordenar(c,[X||X <- Resto, X <
Primeiro]) ++ [Primeiro] ++ ordenar(c,[X||X <- Resto, X >=
Primeiro]);
ordenar(d,[Primeiro|Resto]) -> ordenar(d,[X||X <- Resto, X >
Primeiro]) ++ [Primeiro] ++ ordenar(d,[X||X <- Resto, X =<
Primeiro]).
- Retrospectiva :) :(