Executando verificação de segurança...
0

Quando usar quicksort, mergesort, heapsort...?

Durante o período da faculdade, estudamos alguns algoritmos de ordenação como o quicksort, mergesort, heapsort e outros... são algoritmos bem interessantes, porém quando entramos no mercado de trabalho, acabamos por nos deparar com outra realidade.
Usamos ordenação direto no banco de dados. Muitas vezes quando precisamos ordernar um array de objetos, acabamos utilizando o método .sort de forma bem simples (pelo menos no JS), veja um exemplo:

numbers.sort(function (a, b) { return a - b; });

Então a minha dúvida é: É comúm não utilizarmos esses algoritmos de ordenação no nosso código, seja em javascript ou qualquer outra linguagem?

Parece que desenvolver esses algoritmos para ordernar uma pequena porção de dados, não vai valer apena.

Carregando publicação patrocinada...
3

Na maioria das situações profissionais, é extremamente raro precisar implementar algoritmos de ordenação. As linguagens funções de ordenação oferecidas pela plataforma já são muito bem otimizadas e completamente testadas. A implementação personalizada de um algoritmo de ordenação só se justifica em cenários muito específicos, como quando há requisitos de desempenho extremamente particulares ou ao se trabalhar com tipos de dados 'bizarros'. Mesmo nessas situações, é essencial realizar um profiling do software para verificar se a ordenação realmente é um gargalo e se os métodos padrão não são adequados.

Por outro lado, o ensino de algoritmos de ordenação em cursos de ciência da computação e engenharia de software tem um valor inestimável. Estes algoritmos são fundamentais para o entendimento de conceitos como complexidade de tempo e espaço, recursão e estruturas de dados como árvores e heaps. Aprender esses algoritmos melhora a habilidade de resolver problemas e pensar de forma algorítmica (criar seus próprios algoritmos), como também prepara os desenvolvedores para situações que exigem um entendimento profundo dos processos de ordernação e seja necessário alguma intervenção pontual, mesmo que muitas vezes seja apenas algo pontual.

2

Você aprende isso na faculdade principalmente para que você entenda esses conceitos, e não porquê você vai de fato implementar uma ordenação na mão.

99% das linguagens vão te entregar isso pronto de forma otimizada.

A menos que esteja trabalhando com uma quantidade gigante de dados, não se preocupe com isso.

1

Você aprende para saber quando usar e porque usar. As linguagens já te dão esses algoritmos prontos e otimizados, algumas inclusive permitem que você faça a escolha do algoritmo. Por exemplo, o .sort do javascript depende muito de qual implementação você está utilizando (V8, WebKit, Node, SpiderMonkey, Bun e etc), na maior parde das vezes, Arrays numéricas serão ordenadas com o std::qsort do C++, que é uma variação do quicksort, o introsort, que você sabe como se comporta, pois já conhece o quicksort.

Nessa pergunta no stackoverflow tem mais coisas a cerca do algoritmo utilizado pelo javascript.

Esses algoritmos podem ser classificados de acordo com três características principais (isso se aprende no primeiro ou segundo período de qualquer universidade):

  1. Uso de memória
  2. Estabilidade
  3. Complexidade (melhor, pior e caso médio)

Por exemplo, o mergesort é um algoritmo de complexidade O(nlog(n)), estável e com uso de memória de ordem n, onde n é o tamanho da array.

Isso significa que o mergesort utiliza muita memória para arrays muito grandes, por isso nesses casos, você não vai querer utilizar o mergesort.

Já o Quicksort é um algoritmo de complexidade O(nlog(n)), não estável com uso de memória de ordem n. Um algoritmo de ordenamento estável significa que o algoritmo não faz nenhuma troca em chaves iguais, por isso o quicksort não é estável, dependendo do caso, você precisa de um algoritmo estável (além de a complexidade ir para O(n²) quando se aproxima do pior caso).

O heapsort, por sua vez, é um algoritmo de complexidade O(nlog(n)), estável e de uso de memória na ordem 1, esse teoricamente é o melhor dos mundos para ordenamento, contudo é o algoritmo que faz mais alterações na array, pois precisa construir um max/min heap para realizar o ordenamento, o que faz ter um tempo grande de pré processamento em casos de arrays muito grandes.

Normalmente a própria especifiação ou implementação da linguagem irá decidir qual é o melhor a se utilizar, mas sempre será alguma variação desses três algoritmos, pois são os de menor complexidade. Vale lembrar também dos algoritmos para chaves inteiras (counting sort, radix sort e etc), que serão utilizados sempre que a sua array for composta apenas de chaves inteiras, pois tem uma performance muito maior.