Ordenamiento por conteo
Cuenta cuántas veces aparece cada valor, sin comparar números entre sí.
- Nivel
- Intermedio
- Conceptos:
- Entrada y salida
- Arreglos
- Para
- Azar
- SubProcesos
Ejecuta, modifica y depura este ejemplo en el navegador.
Lo que aprenderás
Como los valores van de 1 a 99, un arreglo conteo guarda cuántas veces aparece cada uno; después se reescribe el arreglo recorriendo conteo en orden. No compara nunca dos números: cuesta O(n + k), donde k es la cantidad de valores posibles. Es muy rápido cuando k es chico, pero no sirve si los valores pueden ser cualquiera.
Código
// Muestra el arreglo completo solo si es corto (30 o menos)SubProceso MostrarDatos(titulo, datos, n) Definir i Como Entero Si n <= 30 Entonces Escribir Sin Saltar titulo Para i <- 1 Hasta n Hacer Escribir Sin Saltar datos[i], " " FinPara Escribir "" SiNo Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")" FinSiFinSubProcesoAlgoritmo OrdenamientoConteo Definir datos, conteo, n, i, valor, veces, k Como Entero Escribir "¿Cuántos números quieres ordenar? (1 a 512)" Leer n Dimension datos[n] Para i <- 1 Hasta n Hacer datos[i] <- Aleatorio(1, 99) FinPara MostrarDatos("Antes: ", datos, n) // Una casilla por cada valor posible (1 a 99): eso es la k de O(n + k) Dimension conteo[99] Para valor <- 1 Hasta 99 Hacer conteo[valor] <- 0 FinPara // Contamos cuántas veces aparece cada valor Para i <- 1 Hasta n Hacer conteo[datos[i]] <- conteo[datos[i]] + 1 FinPara // Reescribimos el arreglo: cada valor tantas veces como apareció k <- 0 Para valor <- 1 Hasta 99 Hacer // "Con Paso 1": si un valor no apareció, este Para no se ejecuta Para veces <- 1 Hasta conteo[valor] Con Paso 1 Hacer k <- k + 1 datos[k] <- valor FinPara FinPara MostrarDatos("Después: ", datos, n)FinAlgoritmoDiagrama de flujo
Cada bloque del diagrama corresponde a una instrucción del código.
Ejemplo de ejecución
Esto muestra el programa al ejecutarlo. Las respuestas escritas por el usuario aparecen resaltadas.
¿Cuántos números quieres ordenar? (1 a 512)Respuesta del usuario: 20Antes: 84 96 41 50 83 97 85 7 67 26 39 94 95 4 40 19 71 4 2 76 Después: 2 4 4 7 19 26 39 40 41 50 67 71 76 83 84 85 94 95 96 97
Complejidad
Cuánto trabajo y memoria necesita según la cantidad de datos (n).
| Caso | Costo |
|---|---|
| Mejor | O(n + k) |
| Promedio | O(n + k) |
| Peor | O(n + k) |
| Memoria | O(k) |
Desafío
Muestra qué valor se repitió más veces.
Ver pista
Recorre conteo buscando su máximo, igual que buscarías el mayor de un arreglo.
Ejemplos relacionados
Ordenamiento burbuja
Ordena números al azar intercambiando vecinos, y se detiene apenas quedan ordenados.
IntermedioOrdenamiento por selección
Busca el menor de los que faltan y lo pone en su lugar.
IntermedioOrdenamiento por inserción
Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.
Intermedio