Aquí dejo otro algoritmo para la ordenación. En el anterior había un bucle que se ejecutaba de forma indefinida y dentro de ese otro bucle que recorría la lista de principio a fin cambiando las posiciones de dos elementos que estuvieran desordenados (uno mayor que otro), realizando un sólo cambio por pasada y volviendo a recorrer la lista entera. En ese método había que detectar expresamente la forma de salir del bucle, lo que se hacia cuando en una pasada de lista no se hubiese producido ningún intercambio de elementos, lo que indicaba que la lista ya estaba ordenada. Para lo cual se usaba una bandera.
Este otro algoritmo es algo distinto. También hay dos bucles. Pero el primer bucle, con índice
i no es indifinido, se ejecuta desde el primer elemento de la lista al último. Es así porque cuando cuando se termina un ciclo de bucle el elemento de la lista
i ya está en su posición ordenada. Por lo tanto cuando se comienza un ciclo
i+1 todos los elementos de la lista
0,1...,i están ya ordenados.
Así pues el segundo índice
j se moverá solamente entre
i+1 y el final de la lista. La segunda diferencia es que mientras antes se recorría la lista varias veces haciendo un sólo cambio cada vez, ahora el segundo bucle cuando encuentra dos elementos desordenados no solamente hace los cambios y sigue hasta el final de la lista, sino que vuelve a la posición
i+1 de la lista, y vuelve a ir desde
i+1 hasta el final o hasta que encuentre otro par desordenado. De esta forma, cuando
j llegue al final de la lista querrá decir que no no hubo intercambio de posiciones desde la última vez, y que, por tanto, el elemento
i ya está en su lugar y se puede pasar al
i+1 sin necesidad de detectar expresamente con una bandera que la lista está ordenada, pues cuando
i llegue al último elemento, todos los elementos anteriores están ya ordenados e
i es el último.
El código de este otro algoritmo es:
// algoritmo de ordenación
for (int i = 0; i < numElementos - 1; i++) {
int j = i + 1;
while (j < numElementos) {
if (lista[i] > lista[j]) {
var = lista[i];
lista[i] = lista[j];
lista[j] = var;
j = i + 1;
}
else j++;
}
}
// fin de algoritmo de ordenación