Cuando trabajamos en un algoritmo es crucial tener claridad y estructura. Iniciar con una pequeña sección de comentarios ayuda a mantener el enfoque y a recordar el objetivo del código. Es una buena práctica que se debe seguir para guiar el desarrollo de cualquier programa.
¿Cómo definir nuestra función en Python?
Estamos por implementar una función de ordenamiento. La buena práctica es darle un nombre significativo. En Python se suele usar la convención de nombres en camelCase. Por ejemplo, bubbleSort. Así comenzamos con minúsculas y cada nueva palabra la iniciamos con mayúscula. Una vez tenemos el nombre, el siguiente paso es definir los parámetros necesarios para la función. En este caso, necesitaremos un arreglo sobre el que trabajar.
defbubbleSort(arr): n =len(arr)
¿Cómo recorrer los elementos del arreglo?
Utilizaremos dos bucles for. El primero recorre todos los elementos del arreglo. El segundo bucle comparará elementos adyacentes para determinar si deben intercambiarse.
for i inrange(n):for j inrange(0, n-i-1):if arr[j]> arr[j+1]: arr[j], arr[j+1]= arr[j+1], arr[j]
El uso de len(arr) nos evita pedir al usuario especificar cuántos elementos tiene el arreglo, haciendo el código más flexible y autónomo.
¿Cómo realizar el intercambio de elementos?
Al identificar que un elemento es mayor que su adyacente, realizamos el intercambio con un simple truco que nos permite hacerlo en una sola línea en Python.
arr[j], arr[j+1]= arr[j+1], arr[j]
Este sencillo paso culmina el ordenamiento de dos elementos adyacentes si se encuentran fuera de lugar.
¿Cómo ejecutar y verificar la función?
Para probar la función, creamos un arreglo con valores aleatorios y llamamos a la función pasando este arreglo como argumento. Después, imprimimos el arreglo ordenado para verificar que el algoritmo funciona correctamente.
arr =[19,12,1,2,3,55,1000,800]bubbleSort(arr)print("El arreglo ordenado de forma ascendente es:")print(arr)
Desafíos para mejorar el algoritmo
El ejercicio propuesto es detectar si no se realizaron intercambios en un ciclo completo para detener la función anticipadamente. Esto mejora la eficiencia del algoritmo al dejar de comparar cuando ya todos los elementos están en orden.
Reto adicional
Implementa una lógica que rompa el bucle si no hay intercambios durante un recorrido, para un mejor rendimiento del algoritmo.
Recuerda, mejorar y optimizar los algoritmos es una parte esencial del aprendizaje. ¡Continúa practicando!
Ordenamiento de Burbuja en Python: Implementación y Ejercicio Práctico
Ordenamiento de Burbuja en Python: Implementación y Ejercicio Práctico
Recursos
Resumen
¿Cómo preparar tu implementación de algoritmo?
Cuando trabajamos en un algoritmo es crucial tener claridad y estructura. Iniciar con una pequeña sección de comentarios ayuda a mantener el enfoque y a recordar el objetivo del código. Es una buena práctica que se debe seguir para guiar el desarrollo de cualquier programa.
¿Cómo definir nuestra función en Python?
Estamos por implementar una función de ordenamiento. La buena práctica es darle un nombre significativo. En Python se suele usar la convención de nombres en camelCase. Por ejemplo, bubbleSort. Así comenzamos con minúsculas y cada nueva palabra la iniciamos con mayúscula. Una vez tenemos el nombre, el siguiente paso es definir los parámetros necesarios para la función. En este caso, necesitaremos un arreglo sobre el que trabajar.
def bubbleSort(arr):
n = len(arr)
¿Cómo recorrer los elementos del arreglo?
Utilizaremos dos bucles for. El primero recorre todos los elementos del arreglo. El segundo bucle comparará elementos adyacentes para determinar si deben intercambiarse.
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
El uso de len(arr) nos evita pedir al usuario especificar cuántos elementos tiene el arreglo, haciendo el código más flexible y autónomo.
¿Cómo realizar el intercambio de elementos?
Al identificar que un elemento es mayor que su adyacente, realizamos el intercambio con un simple truco que nos permite hacerlo en una sola línea en Python.
arr[j], arr[j+1] = arr[j+1], arr[j]
Este sencillo paso culmina el ordenamiento de dos elementos adyacentes si se encuentran fuera de lugar.
¿Cómo ejecutar y verificar la función?
Para probar la función, creamos un arreglo con valores aleatorios y llamamos a la función pasando este arreglo como argumento. Después, imprimimos el arreglo ordenado para verificar que el algoritmo funciona correctamente.
arr = [19, 12, 1, 2, 3, 55, 1000, 800]
bubbleSort(arr)
print("El arreglo ordenado de forma ascendente es:")
print(arr)
Desafíos para mejorar el algoritmo
El ejercicio propuesto es detectar si no se realizaron intercambios en un ciclo completo para detener la función anticipadamente. Esto mejora la eficiencia del algoritmo al dejar de comparar cuando ya todos los elementos están en orden.
Reto adicional
Implementa una lógica que rompa el bucle si no hay intercambios durante un recorrido, para un mejor rendimiento del algoritmo.
Recuerda, mejorar y optimizar los algoritmos es una parte esencial del aprendizaje. ¡Continúa practicando!
Se agrega condicional que verifica si hubo cambios en la iteración anterior. Si no es así, rompe el ciclo principal:
def bubbleSort(array):
n = len(array)
cambios = 1
for i in range(n): #Por estandar, los Auxiliares se definen: i, j, k...
print("Iteracion %d",i)
print(array)
cambios=0
for j in range(0,n-1-i):
if array[j] > array[j+1]:
array[j], array[j+1] = array[j+1], array[j] #Se invierten los valores de las posiciones del arreglo
cambios=1 ##Indica que hubo un intercambio de posiciones en el recorrido
if(cambios<1): #Si no hay intercambios de posiciones (cambios no pasas a 1) se rompe el ciclo
break
array=[190,1200,1,2,4,55,100,6,800]
bubbleSort(array)
print("El arreglo ordenado de forma ascendente: ")
for i in range(len(array)):
print("%d", array[i]),
Agregue un booleano para optimizarlo y detenerse en caso de que el arreglo ya se encuentre ordenado antes de terminar con los cliclos:
#1. Comparaciones de elementos adyacientes
#2. Repetir hasta tener una pasada sin ningun swap
# Orders an array in a non descending order
def bubbleSort( array, showSteps = False):
n = len(array)
# For every element of an array
for i in range( n ):
changes = True #Keeps track if there are changes in the array
# Compares 2 elementos of the array
# Considering that in each loop, the last
# elements are already sorted
for j in range(0, n - i - 1):
# If the elements are not in order, change and update trak
if array[j] > array[ j + 1 ]:
changes = False
array[j], array[ j + 1 ] = array[ j + 1], array[j]
# If debug mode is enable, show steps
if showSteps:
print("Step ", i, end = ": ")
print(array)
# If there were no changes in this loop, stop
if changes:
break
# Driver of the bubbleSort function
def main():
array = [190, 200, 1, 2, 5, 55, 1000, 6, -80, 55]
print("Con el arreglo", end=": ")
print(array)
bubbleSort(array, True)
print("")
print("De forma ordenada no descendente es: ")
print(array)
if __name__ == "__main__":
main()```
Mi solución del reto, puse una bandera dentro del primer ciclo y si no recibe ningún cambio al pasar por el segundo ciclo for se rompe el ciclo for con un break.
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swap = False
print(array)
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swap = True
if not swap:
break
Soy nuevo en programación y literal, me tardé un día pero lo logré ┗(^0^)┓
def bubble_sort(array):
n = len(array)
valor = 0
for i in range(n):
print(array)
valor_anterior = valor
for j in range(0, n-i-1):
if array[j] > array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
valor += 1
if valor_anterior == valor: break
print(f'Valor = {valor}, Valor Anterior = {valor_anterior} ')
if __name__ == "__main__":
array = [190, 1200, 1, 2, 4, 55, 1000, 6, 800]
bubble_sort(array)
print("-" * 100)
print("El arreglo ordenado de forma ascendente es: ")
for i in range(len(array)):
print("%d"%array[i]),
La verdad tuve que ver los aportes pero bueno al final lo entendí.
#1. -Comenzar a hacer comparaciones elementos adyacentes
#2. -Repetir hasta tener una pasada completa sin ningun swap
def bubbleSort(array):
n = len(array)
for i in range(n):
print(array)
cambios = False
for j in range(0, n-i-1):
if array[j] > array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
cambios = True
if cambios == False :
break
array = [190, 1200, 1, 2, 4, 55, 1000, 6, 800]
bubbleSort(array)
print("El arreglo ordenado de forma Ascendente es:")
for i in range(len(array)):
print("%d"%array[i])
def bubbleSort(array):
n = len(array)
for i in range(n):
print(array)
for j in range(0, n-i-1):
if array[j] > array[j+1] :
array[j], array[j+1] = array[j+1], array[j]
como no se programar en python, dejo mi codigo en c++
/* este metodo es lento por tener 2 bucles y hace muchas interacciones */
#include <iostream>
#include <ctime>
using namespace std;
int main(){
srand(time(NULL));
int n = 100;
int aux, arreglo[n];
cout<<"\tElementos Desordenados \n";
for (int i = 0; i < n; i++){
arreglo[i] = rand()% + 100; // rand() % (Hasta - Desde + 1) + Desde para poner un limite o solo se pone + n que sera del cero hasta n
cout<<arreglo[i]<<" ";
}
for (int i = 0; i < n; i++) {
for(int j = 0; j < n; j++){
if(arreglo[j] > arreglo[j+1]){
aux = arreglo[j];
arreglo[j] = arreglo[j+1];
arreglo[j+1] = aux;
}
}
}
cout<<"\n\n\tElementos Ordenado"<<endl;
for(int i = 0; i < n; i++){
cout<<arreglo[i]<<" ";
}
return 0;
}