paulo1205
(usa Ubuntu)
Enviado em 13/11/2017 - 05:41h
Muitas vezes a seleção do algoritmo de ordenação depende das condições de contorno. Você tem restrições de armazenamento? De tempo de tempo de acesso aos dados (e.g. ordenar em disco é mais lento que ordenar em memória)? De tempo total de execução? Precisa de ordenação estável? Recursividade é possível? Está trabalhando com arrays ou com listas (no seu caso, já que você falou em vetor, são arrays)? É mais importante que a execução seja executada o mais rapidamente possível (algoritmos adaptativos) ou ela deve se manter constante? Permite execução paralela de partes do algoritmo?
O algoritmo mostrado pelo phoemur é muito interessante, especialmente para mim, que não o conhecia. Pelo lado positivo não usa comparações entre os valores a serem ordenados, o que elimina o limite mínimo de execução de O(n·log n), é estável e não recorre a recursividade. Por outro lado, ele introduz um segundo nível de indireção (array de ponteiros, o que dá na mesma que ponteiros para ponteiros) dentro de um laço de repetição, usa três arrays além do array original a ser ordenado (um array de saída de cada iteração, com o mesmo tamanho do array a ser ordenado (que é a principal fraqueza do Merge Sort), um para a quantidade de baldes, e o outro para apontar em qual local do array de saída começa cada balde), e ainda coloca dois desses arrays na pilha.
O último problema é fácil de resolver, trocando . A dupla indireção, só se se aumentasse o consumo de memória, passando de O(n) para algo próximo de O(n²), o que seria um absurdo total.
Seu problema menciona centenas de bilhões de inteiros. Para centenas de bilhões de inteiros, você teria de ter memória da ordem casa de terabyte ou mais, seja ela em RAM ou em disco. Pense com cuidado.