2. Criado por Donald Shell (daí o nome Shell) em 1959, publicado pela Universidade de Cincinnati. Como surgiu?
3. Shellsort é derivado do Algoritmo de Inserção. Inserção apenas faz trocas adjacentes Pior caso: fazer n-1 trocas Já O Shell faz trocas a uma certa distância (que diminui a cada passada) Levar, mais rápido, para o ponto correto Como funciona?
4. Primeiro compara elementos separados por “h” posições e os rearranja. Após progressivamente, vai diminuindo a distância de comparação (h) até que h=1 (correspondente ao algorítmo de inserção). Como funciona?
6. Funcionamento R N A D E O R D A N E O R A D E N O 6 2 3 4 5 1 A O R D E N h = 4 h = 2 h = 1 Vetor Ordenado
7. Na primeira passada (h=4), o item O é comparado com N (posições 1 e 5) e trocados. O item R é a seguir comparado e trocado com A (posições 2 e 6) Na segunda passada (h=2), N, D e O, nas posições 1, 3 e 5 são rearrumados para resultar em D, N e O nestas mesmas posições; da mesma forma, A, E e R, nas posições 2, 4 e 6 são comparados e mantidos nos seus lugares A última passada (h=1) corresponde ao algoritmo de inserção, mas apenas trocas locais serão executadas. Entendendo
8.
9. Velocidade: em sequencias moderadas é mais rápido que outros métodos, mas o método da Inserção é o mais interessante para arquivos pequenos (até 20 elementos). Caso a ordenação inicial da sequência seja decrescente ou aleatória, a ordem de grandeza permanece praticamente a mesma. Aplicação: O método Shellsort é o escolhido pela maioria das aplicações por ser muito eficiente para arquivos de até 10000 registros, Implementação simples e quantidade pequena de código, Porém não é um método estável. Comparando à outros médotos
10. voidshellSort(int * vet, intsize) { int i , j , value; intgap = 1; do { gap = 3*gap+1; } while(gap < size); do { gap /= 3; for(i = gap; i < size; i++) { value =vet[i]; j = i - gap; while (j >= 0 && value < vet[j]) { vet [j + gap] =vet[j]; j -= gap; } vet [j + gap] = value; } } while ( gap > 1); } Código de Exemplo:
11. voidshellsort (int x[], int limite) { int i, j, t, h; limite--; h = 1; do { h = 3 * h + 1; } while (h < limite); while (h > 0) { for (i = h; i <= limite; i++) { t = x[i]; for (j = i - h; ((j >= 0) && (x[j] > t)); j = j - h) x[j + h] = x[j]; x[j + h] = t; } h /= 3; } } Código de Exemplo II: