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;
}