Son algoritmos para desordenar y ordenar números naturales, pero como esos números a su vez pueden ser subíndices de listas, arreglos, vectores, tuplas... o como quiera que se les llame, pueden servir para desordenar/ordenar otras cosas.
Por ejemplo ordenar listas de palabras, de entradas de datos, etc.
En cuanto a desordenar, normalmente para lo que sirven es para simular cosas al azar. Por ejemplo un bingo, o cualquier lotería. O, por ejemplo, si se tiene un arreglo de 52 elementos correspondientes a una baraja, si se desordenan los subíndices del arreglo se desordena el arreglo y se simula el barajamiento (vaya palabro, no sé si existe). O un arreglo de 28 elementos correspondientes a las fichas de dominó, al desordenar los subíndices se simula el "meneillo" de las fichas antes de jugar.
También se podrían simular cambios al azar para juegos de recorrido de itinerario con "incidentes" al azar. Por ejemplo, supongamos que queremos hacer un "Juego de la Oca" donde los "incidentes" (la posada, el puente, la calavera, las ocas...) no estén siempre en el mismo lugar sino que en cada nuevo juego se distribuyan en el itinerario de diferente manera, se podría usar.
Explico brevemente de palabra los algoritmos (no descubro las Américas, todo el mundo los conocerá).
DESORDENAR: en cada pasada se toma un elemento al azar de los que van quedando. Al principio se elige entre todos. El elemento elegido se extrae de la lista almacenándolo temporalmente en una variable. Se "corre" toda la lista desde el elemento seleccionado hasta el final. Si imaginamos la lista de elementos en horizontal, con el elemento inicial a la izquierda y el final a la derecha, pues desde el elemento seleccionado al azar y hacia la derecha se pasa cada elemento un lugar hacia la izquierda. Y luego se coloca el elemento extraído, almacenado temporalmente en una variable, en el último lugar (en el el último de la derecha). Ahora se ddisminuye en una unidad el nº de elementos a sortear ( ya solamente se sortea entre los elementos que van quedando a la izquierda) y se repite el proceso hasta llegar a que sólo quede un elemento a la izquierda y ya todos estarán desordenados.
ORDENAR: se va recorriendo la lista de izquierda a derecha, comparando cada elemento "i" con el siguiente "i + 1", cuando se encuentra que un elemento "i" es mayor que el siguiente "i + 1" (si es ordenar de menor a mayor; si fuera de mayor a menor la comparación sería que "i" fuese menor que "i + 1") se intercambian de lugar. Antes de iniciar el recorrido se pone una bandera (flag) que se cambia cuando se produce un intercambio de posiciones. El bucle es -en principo- infinito, sin condiciones, pero cuando la bandera no ha cambiado (no se ha producido ningún intercambio de posiciones) es que ya todos los elementos han quedado ordenados, y se sale del bucle.
Lo dejo todo den un programa en Java que, primero pide el nº de elementos que tendrá la lista, construye la lista de números naturales desde 0 hasta el ingresado - 1, e imprime la lista inicial ordenada. Luego la desordena e imprime la lista desordenada, y posteriromente la vuelve a ordenar e imprime la lista nuevamente ordenada. He señalado en el mini-programita los algoritmos de desordenación/ordenación.
Código
import java.util.Scanner; public class DesordenarOrdenarLista { int numElementos; int [] lista; int numAzar; int numSup; // para elegir numAzar entre 0 y numSup - 1 int var = 0;// guarda temporalmente un elemento de lista[] Scanner teclado; numElementos = teclado.nextInt (); lista = new int[numElementos]; for (int i = 0; i < numElementos; i++) { lista[i] = i; } for (int i = 0; i < numElementos; i++) { } // algoritmo de desordenación numSup = numElementos; for (int i = 0; i < numElementos - 1;i++) { var = lista[numAzar]; for (int j = numAzar; j < numElementos - 1; j++) { lista[j] = lista[j+1]; } lista[numElementos - 1] = var; numSup--; } // fin de algoritmo de desordenación for (int i = 0; i < numElementos; i++) { } // algoritmo de ordenación for (;;) { char flag = 0; for (int i = 0; i < numElementos - 1; i++) { if (lista[i] > lista[i+1]) { var = lista[i]; lista[i] = lista[i+1]; lista[i+1] = var; flag = 1; } } if (flag == 0) break; } // fin de algoritmo de ordenación for (int i = 0; i < numElementos; i++) { } } }