Saltar al contenido
EjemplosEnglishEspacio →

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
Abrir en Codoritmo

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

counting-sort.psc · 43 líneas
// 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)FinAlgoritmo

Diagrama de flujo

Cada bloque del diagrama corresponde a una instrucción del código.

Algoritmo OrdenamientoConteo
Algoritmo OrdenamientoConteoAlgoritmo OrdenamientoConteoAlgoritmo OrdenamientoConteoDefinir datos, conteo, n, i, valor, veces, k Como EnteroDefinir datos, conteo, n, i,valor, veces, k Como EnteroEscribir "¿Cuántos números quieres ordenar? (1 a 512)"Escribir "¿Cuántos númerosquieres ordenar? (1 a 512)"Leer nLeer nDimension datos[n]Dimension datos[n]Para i <- 1 Hasta n HacerPara i <- 1 Hasta ndatos[i] <- Aleatorio(1, 99)datos[i] <- Aleatorio(1, 99)MostrarDatos("Antes: ", datos, n)MostrarDatos("Antes: ",datos, n)Dimension conteo[99]Dimension conteo[99]Para valor <- 1 Hasta 99 HacerPara valor <- 1 Hasta 99conteo[valor] <- 0conteo[valor] <- 0Para i <- 1 Hasta n HacerPara i <- 1 Hasta nconteo[datos[i]] <- conteo[datos[i]] + 1conteo[datos[i]] <-conteo[datos[i]] + 1k <- 0k <- 0Para valor <- 1 Hasta 99 HacerPara valor <- 1 Hasta 99Para veces <- 1 Hasta conteo[valor] Con Paso 1 HacerPara veces <- 1 Hastaconteo[valor] Con Paso 1k <- k + 1k <- k + 1datos[k] <- valordatos[k] <- valorMostrarDatos("Después: ", datos, n)MostrarDatos("Después: ",datos, n)FinAlgoritmoFinAlgoritmo
SubProceso MostrarDatos
SubProceso MostrarDatosSíNoSubProceso MostrarDatos(titulo, datos, n)SubProceso MostrarDatos(titulo,datos, n)Definir i Como EnteroDefinir i Como EnteroSi n <= 30 Entoncesn <= 30Escribir Sin Saltar tituloEscribir Sin Saltar tituloPara i <- 1 Hasta n HacerPara i <- 1 Hasta nEscribir Sin Saltar datos[i], " "Escribir Sin Saltar datos[i]," "Escribir ""Escribir ""Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")"Escribir titulo, n, " números(el primero es ", datos[1], "y el último ", datos[n], ")"FinSubProcesoFinSubProceso

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).

Complejidad
CasoCosto
MejorO(n + k)
PromedioO(n + k)
PeorO(n + k)
MemoriaO(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.

Abrir en Codoritmo