Criado por Donald Shell em 1959, publicado pela Universidade de Cincinnati, o Shell Sort é o mais eficiente algoritmo de ordenação dentre os de complexidade quadrática (não utiliza recursividade).
É 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 vetor 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. Sendo assim, 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.
O algoritmo de ShellSort em si não ordena nada, mas aumenta a
eficiência de outros algoritmos de ordenação (como os da inserção e seleção por exemplo). • ShellSort se baseia em uma variável chamada de incremento de sequência, ou incremento de shell, que é dado por h e ao decorrer da execução do algoritmo, é decrementada até 1.
• Utilizando o incremento de shell, o algoritmo compara elementos
distantes em um vetor, em vez de comparar os adjacentes. • O Shellsort divide o seu vetor em várias partes e muitas vezes. • Funciona assim: • *a primeira coisa que ele faz é pegar o tamanho dos "pulos" para montar os vetorzinhos. através desse trecho: • [code]do { • h = 3 * h + 1; • } while ( h < v.length ); • Trabalhando em um vetor de 10 posições: • 7256310894 • supondo que "h" = 3, então: • 7 6 0 4, será um pequeno vetor pra ordenar, onde "h" é o tamanho dos pulos para selecionar o primeiro vetor. (a cada três posições é selecionado primeiro elemento) • Ordenando esse vetor ficando: • 0467 • 0254316897 • Repetindo as operações acima só que ao invés de iniciar da posição 0, vai se iniciar da posição 1, ficando selecionado: • 0254316897 • ordene-os: • 0254316897 • Pegando e inciando da posição = 2 • 0254316897 • ordene-os: • 0214356897 • Dividindo o h por 3, ficando igual a 1 e repita a operação de cima (vou fazer h = 2 pra explicar melhor) • Seu vetor se encontra assim: • 0214356897 • Agora vamos repetir a operação de cima só que h = 2, selecioando: • 024356897 • ordene-a: • 024356798 • repita a operação pegando de posição = 1 • 024356798 • ordene-a: • 024356798 • agora faça denovo só que com h = 1.