Shell Sort

Criado por Donald Shell em 1959,publicado pela Universidade de Cincinnati, Shell sort é o mais eficiente algoritmo de classificação dentre os de complexidade quadrática. É um refinamento do método de inserção direta.

O algoritmo difere do método de inserção direta pelo fato de no lugar de considerar o array a ser ordenado como um único segmento, ele considera vários segmentos sendo aplicado o método de inserção direta em cada um deles.

Basicamente o algoritmo passa várias vezes pela lista dividindo o grupo maior em menores. Nos grupos menores é aplicado o método da ordenação por inserção. Implementações do algoritmo.

Como tudo funciona

Mãos a obra:


    import java.util.ArrayList;
    import java.util.Random;
    import java.util.Scanner;
    
    public class ShellSort {
    
        public static void main(String[] args) {
            Scanner leia = new Scanner(System.in);
            ArrayList lista = new ArrayList<>();
            int cont = 1;
    
            for (int i = 0; i < 1000; i++) {
                Random rand = new Random();
                int n = rand.nextInt(1000);
                lista.add(n);
            }
    
            shellSort(lista);
    
            for (Integer integer : lista) {
                System.out.print(integer + ", ");
                if (cont % 20 == 0) {
                    System.out.println();
                }
                cont++;
            }
        }
    
        /* ---------------------- Algoritimo De Ordenação ---------------------- */
        private static void shellSort(ArrayList lista) {
            int i, j, h = 1, aux;
    
            do {
                h = 3 * h + 1;
            } while (h < lista.size());
            do {
                h = h / 3;
                for (i = h; i < lista.size(); i++) {
                    aux = lista.get(i);
                    j = i - h;
                    while (j >= 0 && aux < lista.get(j)) {
                        lista.set(j + h, lista.get(j));
                        j = j - h;
                    }
                    lista.set(j + h, aux);
                }
            } while (h > 1);
        }
    }      

    
Tempo de execução(em segundos) VS Qtd de nº no Array:
Shell Sort 1.000 10.000 500.000 1.000.000
Bom 0.002998 0.0406803 0.2290975 0.3457995
Médio 0.0059424 0.0371491 0.6072589 1.1689568
Ruim 0.0037655 0.0034402 0.2805287 0.2654818

*A tabela representa a quantidade de numros utilizadas e o tempo de execução o processo de ordenação