
Recentemente, publiquei muitos artigos sobre vários algoritmos de classificação e sua comparação. Decidi fazer meus próprios cinco centavos.
Quero falar sobre o meu algoritmo favorito para classificar o LSD bit a bit (dígito menos significativo - primeiro o bit menos significativo) com a contagem (Classificação Radix). O algoritmo clássico foi repensado pelo autor para algumas otimizações em favor da aceleração e simplicidade.
Portanto, a classificação proposta é sustentável. Classificaremos os números inteiros de 32 bits. Para funcionar, você precisa de ~ (n + 4KB) de memória adicional, o que é um pouco inútil, mas permite obter algum aumento no desempenho.
Nesse tipo de LSD, comparações e trocas não são usadas, o algoritmo é completamente linear. Complexidade computacional O (N).
A principal característica do algoritmo é a alta eficiência para conjuntos de dados altamente misturados ou aleatórios. Em conjuntos quase ordenados, faz sentido usar outros algoritmos, pois o ganho não será tão significativo. Funciona mal em pequenas matrizes, menos de algumas centenas de elementos.
A classificação ocorre localmente para economizar memória.
O código está escrito em Pascal, mas não será difícil portá-lo para qualquer idioma conveniente para você.
A sequência de execução consiste em dois estágios:
- Para cada bloco (oito dígitos binários - 1 byte (valor ótimo)), contando, sua posição em uma nova matriz é calculada.
- Sequencialmente para cada bloco (do menos significativo para o mais alto), ele se move para a posição calculada anteriormente.
Melhorias:
- Para uma série de compensações, usamos o alinhamento na memória e, devido ao pequeno volume, é colocado em L1 - o cache do processador.
- A matriz de deslocamento é preenchida imediatamente para todos os dígitos, o que permite percorrer a matriz para contar apenas uma vez.
- O cálculo da posição não começa no cabeçalho da matriz, mas no final, isso resolve dois problemas:
- o final da matriz na primeira passagem já está no cache "aquecido", que com matrizes grandes fornece uma ligeira aceleração;
- segundo, o ciclo descendente para zero é mais curto por uma instrução montadora, em cada etapa do ciclo, em relação ao ciclo ascendente.
- Para cada iteração (em quatro), um loop aninhado não é usado, embora menos bonito, mas várias outras instruções do processador são salvas.
Devido à sua simplicidade, o código é quase idêntico em velocidade às compilações de compilador de 32 e 64 bits. Se necessário, é fácil imaginar uma versão do algoritmo para números de 16 e 64 bits.
Comparação do algoritmo de amostragem aleatória com classificação rápida em uma plataforma de 64 bits (em média, dez passes cada).

Sugestões e comentários sobre otimizações são bem-vindos.
Obrigada