Saltar al contenido
EjemplosEnglishEspacio →

Ordenamiento por selección

Busca el menor de los que faltan y lo pone en su lugar.

Nivel
Intermedio
Conceptos:
Entrada y salida
Arreglos
Para
Si
Azar
SubProcesos
Abrir en Codoritmo

Ejecuta, modifica y depura este ejemplo en el navegador.

Lo que aprenderás

En la vuelta i se busca el menor entre las posiciones i y n, y se lo lleva a la posición i con un solo intercambio. Siempre recorre todo lo que falta, así que hace unas n²/2 comparaciones aunque los datos ya estén ordenados: O(n²) en todos los casos, pero como mucho n - 1 intercambios.

Código

selection-sort.psc · 44 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 OrdenamientoSeleccion    Definir datos, n, i, j, minimo, aux, intercambios 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)    intercambios <- 0    // "Con Paso 1" evita que el Para cuente hacia atrás cuando n = 1    Para i <- 1 Hasta n - 1 Con Paso 1 Hacer        // Buscamos el menor entre las posiciones i y n        minimo <- i        Para j <- i + 1 Hasta n Hacer            Si datos[j] < datos[minimo] Entonces                minimo <- j            FinSi        FinPara        // Y lo llevamos a la posición i con un solo intercambio        Si minimo <> i Entonces            aux <- datos[i]            datos[i] <- datos[minimo]            datos[minimo] <- aux            intercambios <- intercambios + 1        FinSi    FinPara    MostrarDatos("Después: ", datos, n)    Escribir "Intercambios realizados: ", intercambiosFinAlgoritmo

Diagrama de flujo

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

Algoritmo OrdenamientoSeleccion
Algoritmo OrdenamientoSeleccionSíNoSíNoAlgoritmo OrdenamientoSeleccionAlgoritmo OrdenamientoSeleccionDefinir datos, n, i, j, minimo, aux, intercambios Como EnteroDefinir datos, n, i, j,minimo, aux, intercambios ComoEnteroEscribir "¿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)intercambios <- 0intercambios <- 0Para i <- 1 Hasta n - 1 Con Paso 1 HacerPara i <- 1 Hasta n - 1 ConPaso 1minimo <- iminimo <- iPara j <- i + 1 Hasta n HacerPara j <- i + 1 Hasta nSi datos[j] < datos[minimo] Entoncesdatos[j] <datos[minimo]minimo <- jminimo <- jSi minimo <> i Entoncesminimo <> iaux <- datos[i]aux <- datos[i]datos[i] <- datos[minimo]datos[i] <- datos[minimo]datos[minimo] <- auxdatos[minimo] <- auxintercambios <- intercambios + 1intercambios <- intercambios +1MostrarDatos("Después: ", datos, n)MostrarDatos("Después: ",datos, n)Escribir "Intercambios realizados: ", intercambiosEscribir "Intercambiosrealizados: ", intercambiosFinAlgoritmoFinAlgoritmo
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: 12Antes:   68 56 75 80 18 35 34 44 6 37 11 41 Después: 6 11 18 34 35 37 41 44 56 68 75 80 Intercambios realizados: 9

Complejidad

Cuánto trabajo y memoria necesita según la cantidad de datos (n).

Complejidad
CasoCosto
MejorO(n²)
PromedioO(n²)
PeorO(n²)
MemoriaO(1)

Características:No estableEn el lugar

Desafío

Cuenta también cuántas comparaciones hace y compáralas con n * (n - 1) / 2.

Ver pista

Suma 1 a un contador justo antes del Si que compara datos[j] con datos[minimo].

Abrir en Codoritmo