Luis Nilson Palma Campos
Ricardo Celis
ProfesorExcelente! Con esto podemos ver que va quedando todo claro!
Luis Nilson Palma Campos
for(int j=0;j<n-i-1;j++)
En esta parte el código también funciona si solo pongo n-1 ¿porque?
Ya que tenemos lista nuestra función de ordenamiento bubbleSort(). Ahora, debemos aprender a implementarla para imprimir los resultados usando algunos ciclos for.
Recuerda que debes evitar algunos nombres especiales para tus funciones porque ya fueron definidos por defecto en nuestros lenguajes de programación. Por ejemplo, nuestra función print va a mostrar error y más bien podemos llamarla print_array.
El desafío de esta clase es realizar el ordenamiento pero, al revés: de mayor a menor. Recuerda dejarlo en la sección de comentarios.
Reto :
Simplemente cambie el > a <
Mayor: if(entry_array[j] > entry_array[j+1]) Menor: if(entry_array[j] < entry_array[j+1])
Me di cuenta de que en la terminal, al imprimir el array nos salen solo 9 numeros a pesar de que hay 10.
Para que se impriman los 10 simplemente cambie esto en la funcion print_array
Cambie el n-1 for(i = 0; i < n - 1; i++) Por: solamente n for(i = 0; i < n; i++)
Luis Nilson Palma Campos
Ricardo Celis
ProfesorExcelente! Con esto podemos ver que va quedando todo claro!
Luis Nilson Palma Campos
for(int j=0;j<n-i-1;j++)
En esta parte el código también funciona si solo pongo n-1 ¿porque?
Carlos Isaac Rosales Castellanos
Hola a todos y al profesor @ricadocelis encontré un error en la función print de esta clase! en la sección de código en la que imprimimos el arreglo, osea la función print, hay un error de código, ya que al poner en el ciclo la condición siguiente:
for(i=0; i < n-1; i++)
se está perdiendo la impresión de la ultima posición del arreglo. La solución es muy simple, cual es sustituyéndola por alguna de estas dos:
for(i=0; i < =n-1; i++)
o
for(i=0; i < n; i++)
Suerte a todos y que les vaya bien por el curso!
Ricardo Celis
ProfesorSelas! Es cierto, muchísimas gracias por esto ==
Aquí está cortito en JS:
Gonzalo Gramaglia
¿Qué pasa si a la función main se le borran los parámetros por defecto “int argc, char const *argv[]”? ¿Para qué sirven?
Edward Steven Ramos Palacios
ProfesorDepende del programa que escribas. Si los borras no pasará nada. Y los puedes usar si necesitas pasarle argumentos/parámetros de entrada a tu programa justo al inicio.
Daniel Santiago Perez Ducuara
"argc" es un entero que contiene el número de argumentos o parámetros que se envían antes de ejecutar el programa. Su valor mínimo será 1, ya que el primer argumento que se envía es el nombre del programa. "argv" es un array que contiene los argumentos o parámetros enviados, en su primera posición (argv[0]) tiene el nombre del programa, en las otras posiciones tiene los argumentos.
Si se coloca o no depende de lo que queramos hacer, si necesitamos recibir esos argumentos antes de iniciar el programa.
Danelia Sanchez Sanchez
Sebastián Pineda Ospina
Claro, pero si quisieras cambiar ahora a floats deberías de cambiar dos veces el código: 1) En la definición del array. 2) En esta línea en específico.
En cambio si lo dejamos como el profe lo programó a la hora de modificar el tipo de datos, nuevamente a un float, solo se debe cambiar el código en una parte: 1) En la definición del array.
Considero que es aunque es válido tu aporte podría ser una mala práctica
Ricardo Moreno
++Mi aporte++ . Tiempo de procesamiento del algoritmo bubble sort: para 10 elementos = 8.153915405273438e-05 [s] para 100 elementos = 0.001003265380859375 [s] para 1k elementos = 0.12418365478515625 [s] para 10k elementos = 12.578235149383545 [s] para 100k elementos = 1438.1797306537628 [s] . Código escrito en python3 te invito a que pases a verlo y corroborar los resultados en colab -> https://colab.research.google.com/drive/1H7WzH2AtZjKJbeoULSjKqjVeCaP8OdO3 . . Pd: No lo intenten con 100k amigos acabo de hacer una fusión nuclear en mi cpu
Eduardo Monzón
Muy valiosa esta info, gracias por el aporte.
Miguel Angel Guerrero Salinas
Implementacion en Python:
def bubbleSort(array: list): array_length = len(array) for _ in range(array_length - 1): for i in range(array_length - 1): temp = array[i] if (array[i] > array[i + 1]): array[i] = array[i + 1] array[i + 1] = temp return array lista = [24, 80, 120, 412, 381, 48, 52] bubbleSort(lista) print(lista)```
LUIS ALEJANDRO BERNAL ROMERO
La línea:
int n = sizeof(vector_enterda) / sizeof(vector_entrada[0]);
se puede cambiar por:
int n = sizeof(vector_enterda) / sizeof(int);
Una manera más corta.
Oswaldo Javier Yugsi Yugsi
JUAN FRANCISCO ochoa lomas
Edward Steven Ramos Palacios
ProfesorFelicidades!
Ricardo Andres Rojas Alonso
Alguien logró completar el reto de hacer que se muestran ordenadamente de mayor a menor la secuencia de datos? La verdad intenté de muchísimas maneras y no lo logré :( alguien que quiera compartirme de qué manera lo hicieron, o qué tuvieron en cuenta para poder encontrarlo... thanks :)
Nelson Matos
Buen día Ricardo. A mi me funciono solamente modificando el signo de (Mayor que >) o (Menor que <) en la condición IF de la función bubblueSort .
void bubbleSort(int vector_entrada[], int n) { int i,j; for(i = 0; i < n-1; i++) { for(j = 0; j < n-i-1; j++) { if(vector_entrada[j] < vector_entrada[j+1]) cambiar_pos(&vector_entrada[j], &vector_entrada[j+1]); } } }
Si le coloco que el (vector_entrada[j] < vector_entrada[j+1]), me ordena los número de mayor a menor. Y si le coloco que el (vector_entrada[j] > vector_entrada[j+1]), me ordena los números de menor a mayor.
Espero te sirva de algo.
Jesús Petrona Castro
Como lo comenta @Nelson Mateos, sólo es cuestión de ajustar el signo dependiendo de el tipo de ordenación que se requiera, la demás lógica no cambia.
Julio Cesar Cuevas Cardenas
En que curso puedo aprender a compilar con el bash de Ubuntu porque no me encuentra el directorio del Visial SC entonces puedo que lleve mi codigo al pie de la letra pero no he podido compilarlo y aun con la herramienta del mismo VSC me dice que no existe el directorio por lo cual no se como saber cual es la ruta correcta para poder ejecutar la compilacion
Alguien me puede ayudar ?
Juan Castro
Profesor¡Hola!
¿Podrías mostrarnos el error que te muestra la consola? Puede que sea algo tan sencillo como la ruta de los archivos. Muéstranos para poderte ayudar. :wink:
Juan Castro
ProfesorTambién te recomiendo tomar el Curso de Prework para instalar y configurar Ubuntu Bash y otras herramientas que nos ayudan a trabajar en desarrollo.
Miqueas Gamero
Necesito ayuda. No comprendo la parte del:
int n = sizeof(arrayIn)/sizeof(arrayIn[0]);
Lorena Perales Anaya
La función sizeof te regresa el valor de un elemento pero en número de bytes, es decir que, si para cada número se ocupan 4 bytes, al calcular el sizeof(arrayIn) te daría 40, pero no queremos este número, sino la cantidad de elementos que tiene nuestro array, así que lo dividimos entre cualquier elemento del array que bien puede ser arrayIn[0] o arrayIn[1] o arrayIn[7] etc. Porque todos tienen la misma cantidad de bytes (4). Entonces al momento de hacer la división, nos queda sizeof(arrayIn)/sizeof(arrayIn[0]) que también se podría ver como numeroTotalDeBytes/numeroDeBytesDeCadaElemento que nos va a dar como resultado la cantidad de elementos en nuestro array, en este caso 10. Espero que te sirva y no te haya confundido más
Miqueas Gamero
Gracias NaruJN. Si, en realidad entendía el propósito de sizeof() y la razón del cociente, pero no entendía por qué no poníamos de entrada el tamaño del arreglo 10 en este caso. Después trabajando con el arreglo del desafío me dí cuenta que era la manera de obtener genéricamente el tamaño de un arreglo del cual desconocemos la cantidad de elementos totales. Saludos
Mauricio Lopez Agudelo
Tengo una duda. ¿Porque la función print_array es de tipo int, cuando no estamos retornando nada?. Gracias!
Diego Forero
Team PlatziPuedes ponerle void en lugar de int, como lo mencionas no retorna nada y no hay problema en que lo hagas o puedes hacer lo mismo que se hace en el main y poner a retornar 0.
José Andrés Hurtado Vásquez
Juan Sebastian Mesa
por qué no está imprimiendo el 1992?
Carlos Rodríguez
El print debe quedar de esta manera:
int printArr(int arrIn[], int n) { for(int i = 0; i < n; i++){ if(i == n - 1) { printf("%d", arrIn[i]); } else { printf("%d, ", arrIn[i]); } } printf("\nFin del ordenamiento\n"); }
keila martinez
reto hecho para ordenar de mayor a menor solo se cambia el signo en el if que esta dentro del for
cxyz cripto
Reto.
Para ordenar de mayor a menor debemos cambiar la comparación que realizamos e intercambiar los argumentos del swap, de modo que ahora sean los elementos de menor valor los que se desplacen hacia la derecha.
Dejo el fragmento de código que use, donde agrege un argumento que indica la opción de ordenamiento.
void bubbleSort(int vector_entrada[], int n, int OPCION) { int i, j; for (i=0; i < n-1; i++) { for (j=0; j < n-i-1; j++) { if ( OPCION == 0 && (vector_entrada[j] > vector_entrada[j+1])) { swap(&vector_entrada[j], &vector_entrada[j+1]); continue; } if (OPCION != 0 && (vector_entrada[j] < vector_entrada[j+1])) { swap(&vector_entrada[j+1], &vector_entrada[j]); } } } }
Carlos Enrique Gonzalez Peña
Ricardo Celis
Profesorcarlosgonzalezp91 Excelentes implementaciones, estás logrando el time complexity estándard para ese tipo de ordenamiento =)
Carlos Enrique Gonzalez Peña
Gracias Ricardo! Tu manera de explicar esta excelente, sigue así. Intentare hacer los retos igual en JS intentando el mejor complexity
Reto cumplido 💪
#include <stdio.h> void cambiarPos(int *n1 ,int *n2 ) { int temp = *n1; *n1 = *n2 ; *n2 = temp; } void bubbleSort(int vectorEntrada[],int n) { for (int i=0;i<n-1;i++) { for(int j=0;j<n-i-1;j++) { if(vectorEntrada[j] < vectorEntrada[j+1]) { cambiarPos(&vectorEntrada[j],&vectorEntrada[j+1]); } } } } int printarray(int vectorEntrada[],int n) { for(int i=0;i<n;i++) { printf("%d ,",vectorEntrada[i]); } printf("\n fin del ordenamiento"); } main(int argc , char const *argv[]) { int vectorEntrada[]={100,1992,0,5,-1,60,70,15,14,10}; int n = sizeof(vectorEntrada)/sizeof(vectorEntrada [0]); bubbleSort(vectorEntrada,n); printarray(vectorEntrada,n); return 0; }
También se puede dividir el tamaño del arreglo entre el tamaño de bytes del tipo de dato del arreglo, en este caso int:
int n = sizeof(vector_entrada) / sizeof(int);
Dejo el reto de esta clase:
#include <stdio.h> void cambiar_pos(int *n1, int *n2) { int temp = *n1; *n1 = *n2; *n2 = temp; } void bubbleSort(int vector_entrada[], int N) { for(int i = N - 1; i >= 0; i--) { for(int j = 0; j < i; j++) { if(vector_entrada[j] < vector_entrada[j + 1]) cambiar_pos(&vector_entrada[j], &vector_entrada[j + 1]); } } } void print_array(int vector_entrada[], int N) { for(int i = 0; i < N; i++) printf("%d ,", vector_entrada[i]); printf("\n fin del ordenamiento"); } int main(int argc, char const *argv[]) { int vector_entrada[] = {100, 1992, 0, 5, -1, 60, 70, 14, 15, 10}; int n = sizeof(vector_entrada) / sizeof(int); bubbleSort(vector_entrada, n); print_array(vector_entrada, n); printf("\n"); return 0; }
Resultado
1992 ,100 ,70 ,60 ,15 ,14 ,10 ,5 ,0 ,-1 , fin del ordenamiento
A continuación envío el main code del Bubble Sort en código Java. He tenido que modificar levemente el funcionamiento del método de ordenamiento puesto que necesitaba almacenar el nuevo orden de los elementos y añadirlos al array original.
Ahora en un momento subiré el código con el reto propuesto.
public class BubbleSort { public static int[] rdo=new int[2]; public static int[] cambiarPosicion(int n1, int n2) { int temp = n1; n1 = n2; n2 = temp; rdo[0]=n1; rdo[1]=n2; return rdo; } public static void bubbbleSort(int[] arrayEntrada, int n) { int i, j; for(i=0; i <n-1; i++) { for(j=0; j<n-i-1; j++) { if(arrayEntrada[j] > arrayEntrada[j+1]) { cambiarPosicion(arrayEntrada[j], arrayEntrada[j+1]); arrayEntrada[j]=rdo[0]; arrayEntrada [j+1]=rdo[1]; } } } } public static int print( int[] arrayEntrada, int n) { int i; for(i=0; i<n; i++) { System.out.print(arrayEntrada[i]+" "); } System.out.println("\n Fin del ordenamiento"); return 0; } public static void main(String[] args) { int[] arrayEntrada= { 58258 ,100, 1992, -1, 60, 70, 14, 15, 10, 6591}; int n=arrayEntrada.length; bubbbleSort(arrayEntrada, n); print(arrayEntrada, n); } }
lo logre
/* 1.- Comenzamos a hacer la comparacion de elementos adyacentes 2.- Repetimos hasta tener una pasada completa sin ningun swap */ #include<stdio.h> void cambiar_pos(int *n1, int *n2) { int temp = *n1; *n1 = *n2; *n2 = temp; } void BubbleSort(int vector_entrada[],int n) { int i, j; for (i = 0; i < n-1; i++) { for (j = 0; j < n-i-1; j++) { if(vector_entrada[j] > vector_entrada[j+1]) cambiar_pos(&vector_entrada[j], &vector_entrada[j+1]); } } } int print_array (int vector_entrada[], int n) { int i; for ( i = 0; i < n; i++) { printf("%d ,", vector_entrada[i]); }printf("\n fin del ordenamiento"); } main(int argc, char const *argv[]) { int vector_entrada[]={100, 1992, 0, 5, -1, 60, 70, 14, 15, 10}; int n = sizeof(vector_entrada)/sizeof(vector_entrada[0]); BubbleSort(vector_entrada, n); print_array(vector_entrada, n); }
++Reto cumplido!++ Le hice una modificación al código. Ahora este puede hacerlo en menos vueltas. Cambie el primer for por un un while con una bandera que este activa mientras se realice algún intercambio en el segundo for . De no hacerse ninguno, significa que el vector ya esta ordenado y el procedimiento termina.
#include <stdio.h> void swap(int *, int *); void bubbleSort(int[], int); void printVector(int[], int); int main(int argc, const char *argv) { int vector[] = {100, 1992, 0, 5, -1, 60, 70, 14, 15, 10}; int n = sizeof(vector) / sizeof(vector[0]); bubbleSort(vector, n); printVector(vector, n); return 0; } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void bubbleSort(int vector[], int n) { int flag = 1; int i = 0; while (flag) { flag = 0; for (int j = 0; j < n - i - 1; j++) { if (vector[j] < vector[j + 1]) { swap(&vector[j], &vector[j + 1]); flag = 1; } } i++; if (!flag) printf("Numero de vueltas: %d\n", i); } } void printVector(int vector[], int n) { for (int i = 0; i < n; i++) printf("%d ", vector[i]); printf("\n"); }
Entrada:
100 1992 0 5 -1 60 70 14 15 10
Salida:
Numero de vueltas: 5 1992 100 70 60 15 14 10 5 0 -1
Buenas! Yo lo hice en JS profe jaja, aquí esta el código, si existe alguna forma de hacerlo mas eficiente pongan me su código en una respuesta ya que estoy buscando la manera de mejorar mi time y space complexity
let arr = [5, 2, 4, 2, 7] const bubleshort = arr => { let temp = 0 let changes = false for (let i = 0; i <= arr.length; i++) { if (i === arr.length) { // Revisamos si i es igual al tamaño del array entonces ya termino de hacer el recorrido (changes) ? //si changes es verdadero quiere decir que se hizo algún movimiento en el recorriendo pasado (changes = false, i = 0) // volvemos a asignarle 0 a i para que vuelva e empezar el recorrido y cambiamos changes a false : console.log(arr) } if (i === 0) { temp = arr[i] //Si es el primer item del array, asignalo a temp para poder comprarlo contra el siguiente } else { (temp > arr[i]) ? (arr[i - 1] = arr[i], arr[i] = temp, temp = arr[i - 1], changes = true) : temp = arr[i] } } } bubleshort([9, 9, 1, 7, 2])
Y para el reto solo se debe cambiar (temp > arr[i]) ? por (temp < arr[i]) ? y eliminar temp = arr[i - 1] por lo tanto quedaría así.
let arr = [5, 2, 4, 2, 7] const bubleshort = arr => { let temp = 0 let changes = false for (let i = 0; i <= arr.length; i++) { if (i === arr.length) { // Revisamos si i es igual al tamaño del array entonces ya termino de hacer el recorrido (changes) ? //si changes es verdadero quiere decir que se hizo algun movimiento en el recorriendo pasado (changes = false, i = 0) // volvemos a asignarle 0 a i para que vuelva e empezar el recorrido y cambiamos changes a false : console.log(arr) } if (i === 0) { temp = arr[i] //Si es el primer item del array, asignarle a temp para poder comprarlo contra el siguiente } else { (temp < arr[i]) ? (arr[i - 1] = arr[i], arr[i] = temp, changes = true) : temp = arr[i] } } } bubleshort([9, 9, 1, 7, 2])