Introducción a la Contando

Contando Sort es un algoritmo de clasificación no basado en comparación que se destaca al ordenar números enteros sobre un rango pequeño y conocido. A diferencia de las clases basadas en comparación como Quicksort o Mergesort, que dependen de comparaciones de elementos pares, Contando Sort determina el orden clasificado contando la frecuencia de cada valor distinto. Este enfoque produce complejidad de tiempo lineal en condiciones favorables, lo que lo convierte en una opción de entrada crítica para muchas aplicaciones de rendimiento.

El algoritmo fue descrito por primera vez por Harold H. Seward en 1954 y sigue siendo una técnica fundamental en la informática. Su simplicidad y eficiencia lo hacen ideal para tareas como ordenar edades estudiantiles, grados o cualquier información de entero con una difusión modesta. Al aprovechar el almacenamiento auxiliar proporcional al rango de valor, Contando Sort evita el límite inferior de comparación O(n + k) con la obtención de valores de entrada.

Cómo Contar Obras Clasificantes

El mecanismo central de Conteo Sort es sencillo: cuenta cuántas veces cada valor aparece en el array de entrada, luego utiliza que cuenta para calcular la posición final de cada elemento. El proceso consiste en tres fases distintas:

  1. Counting: Crear una matriz de cuenta de tamaño k (la gama de valores de entrada), inicializado a cero. Itear a través del array de entrada y aumentar el recuento para cada valor.
  2. Prefijos de computación: Transformar el array de conteo en una matriz de suma prefijo, donde cada elemento en el índice i contiene el recuento acumulativo de elementos menos o igual a i. Este paso determina las posiciones de inicio para cada valor distinto en la salida ordenada.
  3. Ejemplos de fijación: Traverse el array de entrada de derecha a izquierda (para estabilidad), utilice el array de cuenta para encontrar el índice correcto en el array de salida, coloque el elemento allí, y decrete el conteo. La salida final es una copia ordenada de la entrada.

El algoritmo devuelve un nuevo array ordenados, dejando el original sin cambios. Una variante llamada en el lugar Contando Sort existe pero rara vez se utiliza porque compromete la estabilidad o la eficiencia del espacio.

Ejemplo de paso a paso

Considerar la posibilidad de clasificar el array [4, 2, 8, 3, 3, 1] donde los valores van de 0 a 8.

  1. Counto:] Contar el tamaño de la matriz 9 (0–8) → [0,1,2,1,0,0,0,1]. (Index 1 aparece una vez, índice 2 dos veces, índice 3 dos veces, índice 4 una vez, índice 8 una vez).
  2. Resumo de prefijo: Transformar a acumular → [0,1,3,5,6,6,6,7,7]. Ahora cada valor nos indica la posición de inicio de ese número en la salida ordenada.
  3. Salida:] Traverse original array from end: first element read is 1 → position = count[1] - 1 = 0 → output[0]=1, decrement count[1] to 0. Next is 3 → position = count[3] - 1 = 4 → output[4]=3, count[3]=4. Continuar hasta que todos los elementos se coloquen.

Este ejemplo demuestra cómo Contar Sort evita las comparaciones por completo, confiando únicamente en operaciones aritméticas.

Complejidad computacional

Complejidad del tiempo

  • Caso más, medio y peor: O(n + k), donde n es el número de elementos y k es el rango de valores de entrada. Cuando k es pequeño relativo a n, el algoritmo funciona en tiempo lineal.
  • Comparación de las clases de comparación: Quicksort y Mergesort tienen la complejidad media de O(n log n). Para n = 106 y k = 1000, Contabilidad Sort ( 5,001.000 operaciones) es aproximadamente 13 veces más rápido que un tipo de O(n log n).

Complejidad espacial

  • Primario:] O(k) para el array de conteo, más O(n) para el array de salida. Esta memoria puede ser prohibitiva si k es grande (por ejemplo, clasificando los enteros de 32 bits donde k = 232).
  • Vista estable: Requiere un conjunto auxiliar de salida del tamaño n; las variantes en el lugar sacrifican la estabilidad o usan la manipulación compleja del índice.

Cuándo utilizar contando

Contando Sort es más eficaz en las siguientes condiciones:

  • La entrada consiste en enteros (o datos que pueden ser mapeados a una pequeña gama de enteros, como caracteres o categorías discretas).
  • El rango k no es significativamente mayor que n. Una regla común del pulgar es k ≤ O(n).
  • La memoria no se limita severamente, porque el array de cuenta y el buffer de salida requieren espacio extra.
  • Es necesario una estabilidad (por ejemplo, clasificando por múltiples teclas). La aplicación estándar es estable cuando los elementos se colocan de derecha a izquierda.

Los casos de uso excelente incluyen clasificar grados (0–100), edades (0–120), categorías de productos (hasta unos pocos cientos de SKUs), o como una subrutina en Radix Sort.

Limitaciones y consideraciones

A pesar de su velocidad, Contando Sort tiene inconvenientes que limitan su aplicabilidad:

  • Sólo entero: No puede ordenar directamente los números o cadenas de puntos flotantes a menos que se conviertan en un conjunto entero contiguo.
  • rango de la gran: Si k enanafs n -por ejemplo, clasificando 100 números con valores entre 1 y 107- el conjunto de la cuenta consume una enorme memoria mientras clasifica sólo unos pocos elementos.
  • No-adaptivo: Contando Sort siempre requiere escanear toda la entrada y construir la matriz de conteo, incluso si los datos ya están ordenados o casi ordenados.
  • Valores negativos: Conteo Estándar Sort asume números no negativos. Para manejar los negativos, puede cambiar los valores restando el mínimo (haciendo el rango 0 a máx – min).

Estas limitaciones significan Contar Sort es una herramienta especializada, no un reemplazo universal para algoritmos de uso general.

Comparación con Algoritmos de clasificación relacionados

Contando Sort vs. Radix Sort

Radix Sort extiende la idea clasificando dígitos de menor importancia a mayor importancia, utilizando un tipo estable (a menudo contando Sort) en cada dígito. Mientras que Contando Sort funciona en un paso sobre el rango completo k, Radix Sort realiza múltiples pases sobre un rango de dígitos más pequeño (por ejemplo, base 256), reduciendo el uso de memoria para k grande. Por ejemplo, clasificar entradas de 32 bits con la contabilidad Sort2 entradas

Contando Sort vs. Bucket Sort

El Hebilla Sort distribuye elementos en una serie de cubos y clasifica cada cubo individualmente (a menudo con tipo de inserción). Contando Sort puede ser visto como un caso especial de Bucket Sort donde cada cubo corresponde a un único valor distinto. El Hebilla Sort funciona bien en datos de punto flotante distribuidos de forma uniforme, pero Contando Sort se limita a dominios enteros.

Implementando un Clasificado de Conteo Stable

La estabilidad es importante cuando se clasifica por una clave mientras se preserva el orden relativo de elementos iguales de otra clave. El algoritmo estándar de contabilidad Sort es inherentemente estable cuando el bucle de colocación de salida atraviesa la entrada de derecha a izquierda. Aquí está un esquema textual de la variante estable:

  1. Compute count array como se describe.
  2. Convertir en sumas prefijas (posiciones de cada valor en la salida ordenada).
  3. Aborde el array de entrada en orden inverso. Para cada elemento, colóquelo en la posición indicada por su cuenta, luego decremento que cuenta.

Debido a que procesamos elementos desde el final, la última ocurrencia de un valor dado entra en el índice más alto posible, preservando el orden relativo. Esta versión estable es esencial para Radix Sort para funcionar correctamente en cada dígito.

Aplicaciones Prácticas

  • Sistemas de clasificación de la educación: Clasificación de cientos de puntajes de examen (rango 0–100) en tiempo O(n).
  • Bioinformática: Ordenar números enteros o frecuencias k‐mer de ADN cuando el tamaño del alfabeto es pequeño (A, C, G, T).
  • Mantenimiento de índice de base de datos: Clasificación de identificadores enteros únicos en rango lo suficientemente pequeño como para encajar en la memoria.
  • Procesamiento de imágenes: Clasificación de los contenedores de histograma o intensidades de color (0–255) cuando se construyen tablas de búsqueda.
  • Ordenar por clave secundaria: Se utiliza dentro de Radix Sort, que es el caballo de trabajo para una clasificación eficiente en muchas bibliotecas e idiomas (por ejemplo, el tiempo de ejecución .NET utiliza una mezcla adaptativa de algoritmos, incluyendo Contabilidad Sort para pequeñas gamas).

Para más información sobre la teoría y las variantes, consulte referencias autoritativas como Wikipedia: Contando Ordenar y GeeksforGeeksforGeeks: Contando Ordenar. Comparaciones prácticas con otros algoritmos se pueden encontrar en [LT5]

Optimización de Conteo para Grandes Distancias

Cuando k es grande pero n es también grande, puro Contando Sort se convierte en la memoria-intensiva. Existen varias optimizaciones:

  • Espacidez expresa: Usa un mapa de hash en lugar de una matriz contigua cuando la gama de valores usados es grande pero el número de valores distintos es pequeño. Esto intercambia una indexación de tiempo constante para la sobrecarga de escotillas pero reduce el consumo de memoria.
  • Hybrid se acerca: Combinando Contando Ordenar con otros algoritmos. Por ejemplo, si el rango supera 106, utilice Radix Sort con una base que mantiene los rangos de dígitos pequeños.
  • Variantes en el lugar: Algunas optimizaciones reducen el espacio extra a O(k) sin un array de salida, pero generalmente sacrifican la estabilidad o requieren ciclos para localizar posiciones.

Conclusión

Contando Ordenar se destaca como un algoritmo notablemente eficiente para clasificar enteros cuando el rango de valor es pequeño en relación con el número de elementos. Su complejidad de tiempo y rendimiento lineal de O(n + k) lo hacen indispensable en escenarios como clasificación de grados, subroutinas de Radix Sort y aplicaciones con claves de enteros atados. Sin embargo, la dependencia del algoritmo en la entrada de entero y su memoria sobreLT para una sola gama nos recuerda que