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