Estoy tratando de escribir un método de ordenación por inserción, y he logrado terminar, pero no entiendo por qué mi primera versión no puede funcionar correctamente.
Aquí está mi primer intento:
public static void insertionSort(int[] list) {
for (int i = 1; i < list.length; i++) {
int current = list[i];
for (int k = i - 1; k >= 0 && current < list[k]; k--) {
list[i] = list[k];
list[k] = current;
}
}
}
public static void main(String[] args) {
int[] list = {8, 22, 90, 10};
insertionSort(list);
}
Mi salida para el código anterior es: 8, 10, 10, 22
Sin embargo, la respuesta sería correcta si el interior de bucle, en la línea 5, se cambia de: list[i] = list[k];
a:list[k + 1] = list[k];
A mi entender, k + 1
es igual i
, pero tiene que ser diferente en el recuento de bucle y no puedo encontrar la manera. He probado muchos conjuntos de entrada, y sólo los valores que se encuentran entre el rango de los 2 primeros índices (en este caso 8 y 22) sería incorrecta.
k + 1
es igual a i
, pero sólo en la primera iteración de la interior para bucle. int k = i - 1
solamente se ejecuta una vez por iteración del exterior para el bucle.
En la segunda iteración del bucle interior para, k
se decrementa pero i
no lo es. Por lo tanto, k + 1
y i
no son intercambiables dentro del interior de bucle.
// second iteration of the outer for loop, second iteration of the inner for loop:
list[i] = list[k]; // means "list[2] = list[0]
// whereas
list[k + 1] = list[k]; // means "list[1] = list[0]"