Faz sentido para mim que isso acelere a solução de um problema se as duas metades demorarem menos da metade do trabalho de lidar com todo o conjunto de dados.
Essa não é a essência dos algoritmos de dividir e conquistar. Normalmente, o ponto é que os algoritmos não podem "lidar com todo o conjunto de dados". Em vez disso, é dividido em partes que são triviais para resolver (como classificar dois números), depois são resolvidas trivialmente e os resultados são recombinados de maneira a produzir uma solução para o conjunto de dados completo.
Mas por que não dividir o conjunto de dados em três partes? Quatro? n?
Principalmente porque dividi-lo em mais de duas partes e recombinar mais de dois resultados resulta em uma implementação mais complexa, mas não altera a característica fundamental (Big O) do algoritmo - a diferença é um fator constante e pode resultar em uma desaceleração se a divisão e recombinação de mais de 2 subconjuntos criar sobrecarga adicional.
Por exemplo, se você faz uma classificação de mesclagem de 3 vias, na fase de recombinação, agora você precisa encontrar o maior dos 3 elementos para cada elemento, o que requer 2 comparações em vez de 1, para que você faça o dobro da comparação geral . Em troca, você reduz a profundidade da recursão em um fator de ln (2) / ln (3) == 0,63, para que você tenha 37% menos swaps, mas 2 * 0,63 == 26% mais comparações (e acessos à memória). Se isso é bom ou ruim, depende do que é mais caro no seu hardware.
Também vi muitas referências ao quicksort de três vias. Quando isso é mais rápido?
Aparentemente, pode-se provar que uma variante de pivô duplo do quicksort exige o mesmo número de comparações, mas em média 20% menos swaps, por isso é um ganho líquido.
O que é usado na prática?
Atualmente, quase ninguém mais programa seus próprios algoritmos de classificação; eles usam um fornecido por uma biblioteca. Por exemplo, a API Java 7 realmente usa o quicksort de pivô duplo.
As pessoas que realmente programam seu próprio algoritmo de classificação por algum motivo tendem a se ater à simples variante bidirecional, porque menos potencial de erros supera o desempenho 20% melhor na maioria das vezes. Lembre-se: de longe, a melhoria de desempenho mais importante é quando o código passa de "não está funcionando" para "funcionando".