Antes de alterar os algoritmos estabelecidos, resolvi criar um algoritmo inerentemente incondicional. O algoritmo não tem jeito de ser original, mas não encontrei outro semelhante no Google. Por isso, tomo a liberdade de batizá-lo: Power Sort. Logo se verá por que ele tem esse humilde nome.
O algoritmo funciona da seguinte forma:
- Inicializa-se uma variável p com 0;
- Para cada número n da lista, soma-se 2n a p;
- O último elemento da lista é a potência do maior múltiplo de 2 que caiba em p;
- Repete-se o passo 3 tantas vezes quantos elementos houver na lista.
sub psort {
my @sorted=@_;
my $length=scalar(@_);
my $p=0;
foreach my $n (@sorted) {
$p+=2**$n;
}
my $log2=log(2);
for(my $i=$length-1; $i>=0; $i--) {
my $n=int(log($p)/$log2);
$sorted[$i]=$n;
$p=$p-(2**$n);
}
return @sorted;
}
my @sorted=psort(19,8,3,20,16,13,11,52,5,2,18,
4,15,1,9,14,6,7,10,17,12,27,50,0);
print join ',', @sorted;
As vantagens são:
- Não tem ifs!
- Requer pouquíssima memória (não precisa de array auxiliar);
- Não executa trocas;
- Tem complexidade O(n).
E as restrições são:
- Não pode haver números repetidos (embora funcione, de quando em vez);
- Não funciona com arrays grandes, porque a soma cresce muito rapidamente;
- Não funciona com números negativos.
Com base e, ele ficaria mais simples e rápido, mas o número máximo de elementos seria menor.
Nenhum comentário:
Postar um comentário