Ordenamiento Burbuja – Material Didáctico Para el Lenguaje C



Ordenamiento Burbuja – Material Didáctico Para el Lenguaje C

0 0


ordenamientoburbuja


On Github sebastian9 / ordenamientoburbuja

Ordenamiento Burbuja

Material Didáctico Para el Lenguaje C

Creado Por: Sebastián LS / @sebastian9

Ordenamiento

El ordenamiento toma un arreglo desordenado A[ ] y lo convierte en uno ordenado.

A[0] A[1] A[2] A[3] A[4] 66 98 12 75 6 A[0] A[1] A[2] A[3] A[4] 6 12 66 75 98

Imaginemos que el elemento mayor "se eleva" como una burbuja.

Para elevarlo haremos lo siguiente:

Atravesamos el arreglo desde el frente

"Elevamos" el mayor elemento hasta el final

Comparamos e intercambiamos

Cada par

A[0] A[1] A[2] A[3] A[4] 75 66 12 98 6 A[0] A[1] A[2] A[3] A[4] 66 75 12 98 6 A[0] A[1] A[2] A[3] A[4] 66 12 75 98 6 No se intercambian A[0] A[1] A[2] A[3] A[4] 66 12 75 98 6 A[0] A[1] A[2] A[3] A[4] 66 12 75 6 98 Con el primero Terminamos...

Algoritmo para "Elevar la Burbuja"


  	arreglo[MAX]
  	índice <- 1
	límite_superior <- n - 1		

  	ciclo
  	  salir_si (índice > límite_superior)
  	  si (arreglo[índice] > arreglo[índice + 1]) entonces
  	    Intercambiar (arreglo[índice], arreglo[índice + 1])
  	  fin
  	  índice <- índice + 1
  	fin

					

La función Intercambiar



  funcion Intercambiar (a, b)
	  temporal <- a
	  a <- b
	  b <- temporal

					

Debes darte cuenta de que...

  • En el ejemplo sólo el valor más grande fue colocado correctamente
  • Todos los demás elementos están desordenados
  • Es necesario repetir el proceso

A[0] A[1] A[2] A[3] A[4] 66 12 75 6 98

Entonces cuántas veces hay queElevar la Burbuja?

Si tenemos N elementos...

Y si cada vez Elevamos uno de ellos a su posición correcta...

Tendremos que Elevar la Burbuja N - 1 veces para garantizar que hemos acomodado los elementos correctamente.

Elevamos

A[0] A[1] A[2] A[3] A[4] 1 66 12 75 6 98 A[0] A[1] A[2] A[3] A[4] 2 12 66 6 75 98 A[0] A[1] A[2] A[3] A[4] 3 12 6 66 75 98 A[0] A[1] A[2] A[3] A[4] 4 6 12 66 75 98

N - 1 veces

Optimicemos el número de comparaciones

En Azul se pueden ver el número de elementos desordenados que quedan después de cada ciclo

A[0] A[1] A[2] A[3] A[4] 66 12 75 6 98 A[0] A[1] A[2] A[3] A[4] 12 66 6 75 98 A[0] A[1] A[2] A[3] A[4] 12 6 66 75 98 A[0] A[1] A[2] A[3] A[4] 6 12 66 75 98

En una elevación N, únicamente necesitamos hacer MAX - N comparaciones, por ejemplo:

  • Es la tercera elevación
  • Max es 5, el límite superior inicial
  • Por lo tanto tenemos 2 comparaciones por hacer
A[0] A[1] A[2] A[3] A[4] 66 12 75 6 98

¿Cómo se ve ahora?


  límite_superior <- n - 1

  ciclo
    salir_si (límite_superior = 0)
    índice <- 1
    ciclo
      salir_si (índice > límite_superior)
      si (arreglo[índice] > arreglo[índice + 1]) entonces
        Intercambiar (arreglo[índice], arreglo[índice + 1])
      fin
      índice <- índice + 1
    fin
    límite_superior <- límite_superior - 1
  fin

					

Agregamos un ciclo para reducir el límite superiorcada vez que se ordena un valor

Pero...

¿Y si tenemos un arreglo como este?

B[0] B[1] B[2] B[3] B[4] 6 12 98 66 75

El programa ejecutará el procedimiento N-1 veces...aunque sólo haya un elemento fuera de lugar.

Bandera Booleana

Para corregir el error hay que detectar la situación y salir antes del procedimiento

  • Podemos usar una variable booleana para detectar si ocurrió algún intercambio en el procedimiento
  • Si no ocurriera ningún intercambio sabremos que el arreglo ya está ordenado
  • El valor de la variable deberá ser reiniciado cada vez que se ordene un número

Actualizamos nuestro Algoritmo

  cambio <- Verdadero  // Declaramos y asignamos valor a la variable
  límite_superior <- n - 1

  ciclo
	  salir_si ((límite_superior = 0) O (cambio = Falso)) // Aplicamos la condición
	  cambio <- Falso // Y reiniciamos la Variable
	  índice <- 1
	  ciclo
  		  salir_si (índice > límite_superior)
  		  si (arreglo[índice] > arreglo[índice + 1]) entonces
    		  Intercambiar (arreglo[índice], arreglo[índice + 1])    
    		  cambio = Verdadero // Confirmamos un cambio
  		  fin
  		  índice <- índice + 1
	  fin
	  límite_superior <- límite_superior - 1
  fin					
	  				

Ahora Pasemos todo a C

Elevar la Burbuja

						
for (i = 0; i < limite; i++) {
	if (arreglo[i] > arreglo [i+1]){
		intercambiar (&arreglo[i], &arreglo[i+1]);
		cambio = 1;
	}
}

					

La Función Intercambiar


void intercambiar (int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

  					

El Algoritmo con el Límite Disminuyendo

for (limite -= 1; !(limite == 0); limite--) {
	for (i = 0; i < limite; i++) {
		if (arreglo[i] > arreglo [i+1]){
			intercambiar (&arreglo[i], &arreglo[i+1]);
		}
	}
}
					

Comnezamos con N - 1, disminuimos N en cada iteración, y terminamos cuando ya no hay más comparaciones por hacer.

Bandera Booleana

char cambio = 1; // Declaramos la variable booleana
for (limite -= 1; (!(limite == 0) && cambio); limite--) { // Nueva condición
	cambio = 0; // Reiniciamos la variable
	for (i = 0; i < limite; i++) {
		if (arreglo[i] > arreglo [i+1]){
			intercambiar (&arreglo[i], &arreglo[i+1]);
			cambio = 1; // Confirmamos un cambio
		}
	}
}
					

Todo junto con últimos detalles

void intercambiar (int *a, int *b);

int main () {

	int limite, i, temp; // Temp remplaza a limite en el output
	int cambio = 1;
	int count = 0; // Verifica que el número de iteraciones sea el mínimo

	printf("Ingrese el número de elementos\n");
	scanf("%d", &limite);

	int arreglo[limite];

	printf("Ingrese %d elementos\n", limite);
	for (i = 0; i < limite; i++)
		scanf("%d", &arreglo[i]);

	temp = limite;

	for (limite -= 1; (!(limite == 0) && cambio); limite--) {
		cambio = 0;
		for (i = 0; i < limite; i++) {
			if (arreglo[i] > arreglo [i+1]){
				intercambiar (&arreglo[i], &arreglo[i+1]);
				cambio = 1;
			}
		}
		count++;
	}

	printf("Estos son los elementos ordenados:\n");
	for (i = 0; i < temp; i++)
		printf("%d\n", arreglo[i]);

	printf("Número de ciclos: %d\n", count);
}

void intercambiar (int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
					

¡Felicidades!Ya sabes ordenamiento burbuja.

Ordenamiento Burbuja Material Didáctico Para el Lenguaje C Creado Por: Sebastián LS / @sebastian9