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):
- Uso de memória
- Estabilidade
- 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.