¿Por qué hay una diferencia entre dos implementaciones similares de un bucle 'for'?

Glu:

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 + 1es 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.

barredora:

k + 1 es igual a i, pero sólo en la primera iteración de la interior para bucle. int k = i - 1solamente se ejecuta una vez por iteración del exterior para el bucle.

En la segunda iteración del bucle interior para, kse decrementa pero ino lo es. Por lo tanto, k + 1y ino 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]"

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=168358&siteId=1
Recomendado
Clasificación