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 | 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... |
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
A[0] | A[1] | A[2] | A[3] | A[4] |
---|---|---|---|---|
66 | 12 | 75 | 6 | 98 |
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.
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
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:
A[0] | A[1] | A[2] | A[3] | A[4] |
---|---|---|---|---|
66 | 12 | 75 | 6 | 98 |
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 superior
cada 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 | 75 |
El 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;
}