
Recientemente publiqu茅 muchos art铆culos sobre varios algoritmos de clasificaci贸n y su comparaci贸n, decid铆 hacer mis propios cinco centavos.
Quiero hablar sobre mi algoritmo favorito para la ordenaci贸n por bits de LSD (d铆gito menos significativo - primero el bit menos significativo) con el conteo (clasificaci贸n por radix). El algoritmo cl谩sico fue repensado de alguna manera por el autor hacia algunas optimizaciones a favor de la aceleraci贸n y la simplicidad.
Entonces, la clasificaci贸n propuesta es sostenible. Ordenaremos los n煤meros enteros de 32 bits. Para trabajar, necesita ~ (n + 4KB) de memoria adicional, lo cual es un desperdicio, pero le permite lograr un aumento en el rendimiento.
En este tipo de LSD, no se utilizan comparaciones e intercambios, el algoritmo es completamente lineal. Complejidad computacional O (N).
La caracter铆stica principal del algoritmo es la alta eficiencia para conjuntos de datos altamente mixtos o aleatorios. En conjuntos casi ordenados, tiene sentido usar otros algoritmos, ya que la ganancia no ser谩 tan significativa. Funciona mal en arreglos peque帽os, menos de un par de cientos de elementos.
La clasificaci贸n se realiza localmente para ahorrar memoria.
El c贸digo est谩 escrito en Pascal, pero no ser谩 dif铆cil portarlo a cualquier idioma conveniente para usted.
La secuencia de ejecuci贸n consta de dos etapas:
- Para cada bloque (ocho d铆gitos binarios - 1 byte (valor 贸ptimo)), contando, se calcula su posici贸n en una nueva matriz.
- Secuencialmente para cada bloque (del menos significativo al m谩s alto), se mueve a la posici贸n calculada previamente.
Mejoras:
- Para una variedad de compensaciones, utilizamos la alineaci贸n en la memoria y, debido al peque帽o volumen, se coloca en L1, la memoria cach茅 del procesador.
- La matriz de desplazamiento se llena inmediatamente para todos los d铆gitos, lo que le permite recorrer la matriz para contar solo una vez.
- El c谩lculo de la posici贸n no comienza desde el encabezado de la matriz, pero desde el final, esto resuelve dos problemas:
- el final de la matriz en el primer paso ya est谩 en la cach茅 "calentada", que con matrices grandes da una ligera aceleraci贸n;
- en segundo lugar, el ciclo descendente a cero es m谩s corto por una instrucci贸n de ensamblador, en cada paso del ciclo, en relaci贸n con el ciclo ascendente.
- Para cada iteraci贸n (de cuatro), no se usa un bucle anidado, aunque con menos belleza, pero se guardan varias instrucciones m谩s del procesador.
Debido a su simplicidad, el c贸digo es casi id茅ntico en velocidad a las compilaciones de compiladores de 32 y 64 bits. Si es necesario, es f谩cil imaginar una versi贸n del algoritmo para n煤meros de 16 y 64 bits.
Comparaci贸n del algoritmo de muestreo aleatorio con clasificaci贸n r谩pida en una plataforma de 64 bits (en promedio, diez pases cada uno).

Sugerencias y comentarios sobre optimizaciones son bienvenidos.
Gracias