Ordenamiento por Selección en Python: Paso a Paso
Clase 8 de 10 • Curso de Introducción a los Algoritmos de Ordenamiento
Contenido del curso
Clase 8 de 10 • Curso de Introducción a los Algoritmos de Ordenamiento
Contenido del curso
Mariano Navarrete
Miguel Andres Rendon Reyes
RIVERS EMMANUEL MORALES SALAZAR
Royer Guerrero Pinilla
Gonzalo Gramaglia
Royer Guerrero Pinilla
Dilan Santiago Ariza Cañon
Javier Daza
Dilan Santiago Ariza Cañon
Sergio Daniel Castañeda Pérez
Juan Antonio Aramburo Pasapera
Jesús Petrona Castro
Javier Daza
Javier Daza
Luis Lira
Jesus Adrian Berrio Valdes
Brenda Palacio Carrasquilla
Juan Carlos Casas R
Gerson Montenegro
Giancarlo Culcay
Paula Andrea Hayle
Ivan Ezequiel Mazzalay
Javier Daza
Ivan Ezequiel Mazzalay
Andres Gutierrez Gaviria
Vinicio Velez
Rosario Sánchez
Jesus David Loera Valverde
Elver Tobo
Renato Daniel Carvajal Bustos
Renato Daniel Carvajal Bustos
Julians Jesús Landeras Pinedo
Hans Arias
Nicolas Alpargatero
Ian Yared Oliva Hernández
let arr = [3,1,2,5,8,10,9,6]; const selectionSort = (arr) => { let tam = arr.length; let aux = 0; for (let i = 0; i < tam; i++){ let indMin = i; for (let j = i + 1; j < tam; j++){ if(arr[indMin] > arr[j]){ indMin = j; } } aux = arr[i]; arr[i] = arr[indMin]; arr[indMin] = aux; console.log(arr); } } selectionSort(arr);
Javascript para un curso en Python, que rebelde xD
perfect
Luego de todo ya lo entieno, lo que se hace es recorrer el array original buscando el valor minimo y ese valor lo enviamos a un nuevo array con el fin de ir creando un array ordenado
El array siempre es el mismo. Tomando como ejemplo esta clase el único array que se declara es el "A". No hay ningún otro. . De lo que vos hablás es de sub-arrays, que son en realidad conceptos abstractos para entender mejor qué es lo que está sucediendo. . En la práctica se trabaja siempre sobre el mismo arreglo. . P.D.: No sé mucho del tema, intenté explicarlo lo mejor que pude. Si alguien puede complementar lo que dije, o incluso corregirme se lo voy a agradecer un montón :)
Tienes toda la razon 👍
Espero le ayude a alguien mi código :)
# 1. Buscar el numero menor en mi array # 2. Crear dos subarrays para llevar el control de mi algoritmo # 3. devolver los datos del array ordenados import sys def selectionSort(array): # Recorre todo nuestro array for i in range(len(array)): print(array) #Encontrar el menor dato del array desordenado #Auxiliar de el array desordenado idxDesordenado = i for j in range(i+1, len(array)): if array[idxDesordenado] > array[j]: idxDesordenado = j # cuando encontramos el minimo elemento, lo cambiamos por el primer valor de nuestro array desordenado array[i], array[idxDesordenado] = array[idxDesordenado], array[i] def main(): array = [3,124,412,13,235,2,323,3,212,1,25,5,3,323,6,3] selectionSort(array) print("Array ordenado: ") for i in range(len(array)): print("%d"%array[i]) if __name__ == "__main__": main()
¿Para qué sirve __name__ == '__main__'?
@javidaza
Es para asegurarse que el archivo es el paquete principal, para evitar que se ejecuten otros paquetes, es una buena practica en Python (creo)
Hola a todos, dos preguntas muy sencillas:
sys lo usan a veces para recibir parámetros de la linea de comandos. En este caso en realidad no lo usó para nada.
La coma del final tampoco debe llevarla, probablemente es porque Ricardo suele usar programas como C y Js que sí deben llevar un ";" al final de cada statement.
Reto e implementación en java.
private static void selectionSort(Integer[] array) { for(int i = 0; i < array.length - 1; i++) { int min = array[i]; int index = i; for(int j = i+1; j < array.length; j++) { if(array[j] < min) { min = array[j]; index = j; } } swap(array,i,index); List arr = Arrays.asList(array); System.out.println("Iteración "+ (i+1) +": "+arr); } } private static void swap(Integer[] array, int origin, int destinity) { int tempValue = array[origin]; array[origin] = array[destinity]; array[destinity] = tempValue; }
¿Para qué es la coma al final del último for?
Encontré la respuesta en SO. La documentación dice que al final del print se añade un '\n' para agregar un salto de línea. La coma impide ese salto de línea en python 2.7. En python 3.x se puede pasar el parámetro end para colocar un final diferente
Genial por el aporte que añadiste después, realmente no sabía para qué podía servir esa coma del final y seguramente a muchos les servirá esto para aclarar esa duda :D
MI solución en Python
[arr.pop(arr.index(min(arr))) for i in range(len(arr))]
lo que hago es un for de 0 al largo del array donde hago un pop (quitar de la lista y retornar como valor) del elemento mas pequeño del array, para calular el mas pequeño le digo que me devuela de indice del elemeto mas pequeño con la fucio min y se lo paso como parametro al pop
Dejo mi aporte del Reto UwU
#Buscar el numero menor en mi array #Crear dos subarrays para llevar el control de mi algoritmo #Imprimir el resultado del ordenamiento import sys array = [20, 5, 21, 6, 23, 7, 34, 999, 68] def selectionSort(array): #Recorer todo nuestro array for i in range(len(array)): #Encontrar el valor minimo restante dentro de nuestro array desordenado idxDes = i for j in range(i+1, len(array)): if array[idxDes] > array[j]: idxDes = j #Ya que encontramos el minimo lo vamos a cambiar por el primer valor de nuetsro array desordenado array[i], array[idxDes] = array[idxDes], array[i] print("process %d", i) print(array) #Ejecutar la funcion selectionSort(array) print("Array Ordenado:") for i in range(len(array)): print("%d"%array[i]),
Excelente implementacion. Gracias por el aporte
Mi versión del reto
import random limite = 10 array = [random.randint(0, limite) for i in range(limite)] for i in range(len(array)): auxIndex = i for j in range(i + 1, len(array)): if array[auxIndex] > array[j]: auxIndex = j print (f'{i}: {array}') array[i], array[auxIndex] = array[auxIndex], array[i] print(f'Resultado: {array}')
Con eso obtuve la sgte salida:
0: [10, 8, 9, 1, 9, 10, 1, 0, 2, 0] 1: [0, 8, 9, 1, 9, 10, 1, 10, 2, 0] 2: [0, 0, 9, 1, 9, 10, 1, 10, 2, 8] 3: [0, 0, 1, 9, 9, 10, 1, 10, 2, 8] 4: [0, 0, 1, 1, 9, 10, 9, 10, 2, 8] 5: [0, 0, 1, 1, 2, 10, 9, 10, 9, 8] 6: [0, 0, 1, 1, 2, 8, 9, 10, 9, 10] 7: [0, 0, 1, 1, 2, 8, 9, 10, 9, 10] 8: [0, 0, 1, 1, 2, 8, 9, 9, 10, 10] 9: [0, 0, 1, 1, 2, 8, 9, 9, 10, 10] Resultado: [0, 0, 1, 1, 2, 8, 9, 9, 10, 10]
PD: no es necesario importar sys
excelente
funciono!!! :* uwu
Les dejo mi código con el reto resuelto!!!
def selectionSort(array): #Recorremos todo el array for i in range(len(array)): print(array) #Encontramos el valor mínimo restante dentro de nuestro array desordenado indiceDesordeando = i for j in range(i + 1, len(array)): if array[indiceDesordeando] > array[j]: indiceDesordeando = j #Ya que encontramos el mimino lo vamos a cambiar #por el primer valor de nuestro array desordenado array[i], array[indiceDesordeando] = array[indiceDesordeando], array[i] def main(): array = [20, 5, 21, 6, 23, 7, 34, 999, 68] selectionSort(array) print("Array ordenado: ") for i in range(len(array)): print(array[i]) if __name__ == '__main__': main()
¿Para que sirve __name__ == '__main__' ?
Es el equivalente a la función main de lenguajes C, C++, etc. Es el Entry Point, cuando Python se encuentra con esto, invoca a la función principal y ejecuta el código. Te dejo un link útil con más info sobre esto!
Geek for Geeks
Codigo con ciclos:
# ...existing code...
import sys
array = [29,21,23,34,68,72,100]
def selectionSort(array):
# recorrer todo nuestro array
for i in range(len(array)):
min_idx = i
# encontrar el valor minimo restante dentro de nuestro array desordenado
for j in range(i + 1, len(array)):
if array[min_idx] > array[j]:
min_idx = j
# ya que encontramos el minimo lo vamos a cambiar por el primer valor de nuestro array desordenado
array[i], array[min_idx] = array[min_idx], array[i]
for i in range(len(array)):
print("%d" % array[i])
# ejecutar la función
selectionSort(array)
import sys , es para ?
Hola Vinicio! Al importar sys estamos trayendo funciones a la computadora para que Python trabaje con él de una manera más sencilla.
Pero, para qué importó la librería en este caso? creo que puede funcionar sin importarla.
Creo que me salió un poco más sencillo.
def selection_sort(array): for i in range(len(array)): for j in range(len(array)): if array[j] > array[i]: array[j], array[i] = array[i], array[j] return array vals = [2,1,4,2,1,3,5,7,23,5,3,56,3,1000] print(selection_sort(vals.copy()))
def oSelecion(lista): n = len(lista) for i in range(n): print(i, lista) valorMin = min(lista[i:n]) ind = lista.index(valorMin) lista[i], lista[ind] = valorMin, lista[i] return lista if __name__ == "__main__": lista1 = [19, 83, 8, 56, 42, 48, 21, 62, 86, 23] listaOrde = oSelecion(lista1) print(listaOrde) # Me salio asi con un solo for
def oSelecion(lista): n = len(lista) lista2 = [0] * len(lista) for i in range(n): print(lista) print(lista2) valorMin = min(lista) ind = lista.index(valorMin) lista2[i] = valorMin lista.pop(ind) return lista2 if __name__ == "__main__": lista1 = [19, 83, 8, 56, 42, 48, 21, 62, 86, 23] listaOrde = oSelecion(lista1) print(listaOrde) ```Lo que entendí de la clase anterior es que habían 2 listas
Mi aporte en PHP$array = [20, 5, 21, 6, 23, 7, 34, 999, 68];
$array = [20, 5, 21, 6, 23, 7, 34, 999, 68]; function selectionSort(&$array){ #Captura el numero de elementos del array $n = count($array); #Recorre el array #$n-1 pues en la penultima iteración, la ultima posición del array queda ordenada #nos ahorramos de hacer una iteracion más for ($i = 0; $i < $n-1 ; $i++) { #Encontrar el valor minimo restante dentro de nuestro array desordenado #$idxDes es la posición minima del array $idxDes = $i; //Imprimir los ordenamiento por cada iteración #$j vale siempre una posición más qué $i para realizar la comparación for ($j = $i+1; $j < $n; $j++) { if ($array[$idxDes] > $array[$j]){ $idxDes = $j; #Iguala $idxDes a $J para romper el for } } #Se crea una lista para intercambiar las posiciones los elementos del array list($array[$i], $array[$idxDes]) = array($array[$idxDes], $array[$i]); foreach ($array as $elemento) { echo $elemento." "; } echo "\n"; //Salto de linea para mayor orden } } selectionSort($array); echo "Array ordenado: \n"; for ($i = 0; $i < count($array); $i++) { echo $array[$i]." "; }
def sortNumbers (arr): for i in range(len(arr)): indexMinimum = i; indexNextNumber = i + 1; while (indexNextNumber < len(arr)): if arr[indexMinimum] > arr[indexNextNumber]: indexMinimum = indexNextNumber indexNextNumber += 1 arr[i], arr[indexMinimum] = arr[indexMinimum], arr[i] print(arr) arr = [190, 1200, 1, 2, 4, 55, 1000, 6, 800] sortNumbers(arr)
Yo lo implemente con for y un while.
El reto solo era imprimir ? porque en recursos solo dejo el mismo archivo de la clase solo que cambio variables. Bueno lo importante es que se entendio.
Yo implementé un generador aleatorio para el array con un list comprehension y haciendo uso de la función "randrange" de la librería “random”
from random import randrange def selectionSort(array): for i in range(len(array)): idxDes = i for j in range(i+1,len(array)): if array[idxDes]>array[j]: idxDes = j array[i],array[idxDes]=array[idxDes],array[i] lista = [randrange(1,300,8) for i in range(10)] print("La lista desordenada se ve asi",lista) selectionSort(lista) print("La lista ordenada se ve asi",lista)
La salida se ve de la siguiente manera: