On Github sebastian9 / ordenamientoburbuja
Creado Por: Sebastián LS / @sebastian9
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 98Imaginemos 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
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
funcion Intercambiar (a, b) temporal <- a a <- b b <- temporal
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.
N - 1 veces
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 98En una elevación N, únicamente necesitamos hacer MAX - N comparaciones, por ejemplo:
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
¿Y si tenemos un arreglo como este?
B[0] B[1] B[2] B[3] B[4] 6 12 98 66 75El programa ejecutará el procedimiento N-1 veces...aunque sólo haya un elemento fuera de lugar.
Para corregir el error hay que detectar la situación y salir antes del procedimiento
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
for (i = 0; i < limite; i++) { if (arreglo[i] > arreglo [i+1]){ intercambiar (&arreglo[i], &arreglo[i+1]); cambio = 1; } }
void intercambiar (int *a, int *b) { int temp = *a; *a = *b; *b = temp; }
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.
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 } } }
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; }