Então, se você leu meu artigo anterior , sou totalmente favorável a aprender muitas coisas e buscar inspiração em muitos lugares.
Tenho aprendido um haskell e cheguei a esta parte do livro onde há uma implementação de classificação rápida de haskell.
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]
biggerSorted = quicksort [a | a <- xs, a > x]
in smallerSorted ++ [x] ++ biggerSorted
Observe como a implementação está literalmente dizendo a você o que está fazendo.
> If I get an empty list return an empty list
> if I have a list
>>> take the first element.
| get items smaller than first element THEN sort these
| get items larger than first element THEN sort these
| return
sorted smaller items + first element + sorted larger items
Eu queria capturar a mesma ideia e sentimento em perl, e assim fiz, é assim que parece:
Ok, não tenho ideia de por que @xs fica estranho aqui . Veja o código como essência aqui .
sub sort_
{
my @xs = @_;
if(scalar(@xs) == 0) {return ();}
my @lesser = sort_(grep { $_ < $xs[0] } @xs );
my @greater = sort_(grep { $_ > $xs[0] } @xs );
return (@lesser, $xs[0], @greater);
}
Uso:
my @items = (101, 1,90,10,4,2,100);
say join ",", sort_ @items; # 1,2,4,10,90,100,101