package capitulo04.bloque03;

import static capitulo04.utils.Utils.crearArrayNumsAleatorios;
import static capitulo04.utils.Utils.mostrarArrayNums;

public class Ejercicio03 {
    public static void main(String[] args) {
        int[] nums150 = crearArrayNumsAleatorios(150, 0, 1000);
        mostrarArrayNums(nums150);
        System.out.println();
        mostrarArrayNums(ordenarShell(nums150));
    }

    public static int[] ordenarShell(int[] array) {
        int[] saltos = new int[] {1750, 701, 301, 132, 57, 23, 10, 4, 1};

        for (int salto : saltos) {
            for (int inicio = 0; inicio < salto; inicio++) {
                for (int i = inicio + salto; i < array.length; i += salto) {
                    int valorActual = array[i];
                    int j = i;

                    while (j >= salto && array[j - salto] > valorActual) {
                        array[j] = array[j - salto];
                        j -= salto;
                    }

                    array[j] = valorActual;
                }
            }
        }

        return array;
    }
}
