El algoritmo de ordenación por selección es una técnica sencilla pero efectiva para ordenar un conjunto de elementos. Su funcionamiento se basa en encontrar repetidamente el elemento mínimo dentro de la parte no ordenada del array y colocarlo en la posición correcta mediante intercambios.
Para entenderlo mejor, imaginemos que tenemos un vector desordenado. Lo primero que hacemos es buscar el elemento mínimo en todo el vector. Por ejemplo, si el vector contiene los números 6, 4, 2, 1, 3 y 5, comenzamos asumiendo que el primer elemento, 6, es el mínimo. Luego comparamos con el siguiente elemento, 4, que es menor, por lo que actualizamos el mínimo a 4. Continuamos con 2, que es aún menor, y luego con 1, que se convierte en el nuevo mínimo. Los números 3 y 5 no son menores que 1, así que el mínimo final es 1.
Una vez encontrado el mínimo, lo intercambiamos con el elemento que está en la primera posición del vector. Así, el 1 pasa a estar ordenado en la primera posición. A continuación, repetimos el proceso para el resto del vector, pero esta vez empezando desde la segunda posición, ya que la primera ya está ordenada.
En la siguiente iteración, buscamos el mínimo entre los elementos restantes. Si el vector ahora es [1, 4, 2, 6, 3, 5], asumimos inicialmente que 4 es el mínimo. Al comparar con 2, vemos que 2 es menor, por lo que actualizamos el mínimo a 2. Los demás elementos no son menores que 2, así que intercambiamos 2 con el elemento en la segunda posición, que es 4. Ahora, los dos primeros elementos están ordenados.
Este proceso se repite para cada posición del vector, buscando el mínimo en la parte no ordenada y colocándolo en la posición correcta. Por ejemplo, en la siguiente iteración, el mínimo será 3, que se intercambia con el elemento en la tercera posición, y así sucesivamente hasta que todo el vector esté ordenado.
Para implementar este algoritmo, necesitamos conocer tres cosas: la posición donde colocaremos el elemento mínimo encontrado, el punto desde donde empezamos a buscar el mínimo en cada iteración, y cuál es el mínimo actual mientras recorremos el vector.
El código para este algoritmo puede estructurarse con dos bucles anidados. El bucle externo recorre desde la primera posición hasta la penúltima, ya que el último elemento quedará ordenado automáticamente. En cada iteración del bucle externo, asumimos que el elemento en la posición actual es el mínimo. Luego, el bucle interno recorre el resto del vector para encontrar si existe algún elemento menor que el mínimo asumido. Si encontramos uno, actualizamos la posición del mínimo.
Una vez que terminamos de buscar el mínimo en la iteración actual, intercambiamos el elemento mínimo encontrado con el elemento en la posición actual del bucle externo. Para hacer este intercambio, no podemos simplemente asignar un valor a otro sin perder datos, por lo que usamos una variable temporal que nos permite guardar uno de los valores mientras realizamos el intercambio.
El intercambio se realiza guardando primero el valor de una de las posiciones en la variable temporal, luego asignamos el valor de la otra posición a la primera, y finalmente colocamos el valor guardado en la variable temporal en la segunda posición. De esta forma, conseguimos intercambiar los valores sin perder ninguno.
Un ejemplo de código en Java que implementa este algoritmo sería:
public void seleccion(int[] array) {
int n = array.length;
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (array[j] < array[min]) {
min = j;
}
}
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
En este código, i representa la posición donde colocaremos el elemento mínimo encontrado, y min es la posición del mínimo actual dentro del recorrido. El bucle interno busca el mínimo en la parte no ordenada del array, y luego realizamos el intercambio usando la variable temporal temp.
Así, paso a paso, el algoritmo de ordenación por selección va ordenando el vector desde la primera posición hasta la última, asegurando que en cada iteración el elemento mínimo se coloca en su lugar correcto.