ShellsortAnderson Zardo | Jean Carlo Soares
Criado por Donald Shell (daí o nome Shell) em 1959, publicado pela Universidade de Cincinnati.Como surgiu?
Shellsort é derivado do Algoritmo de Inserção.Inserção apenas faz trocas adjacentesPior caso: fazer n-1 trocasJá O Shell faz trocas a uma certa distância (que diminui a cada passada)Levar, mais rápido, para o ponto corretoComo funciona?
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?
ExemploO   R   D   E   N   Ah = 4h = 2h = 1
FuncionamentoRNADEORDANEORADENO623451AORDENh = 4h = 2h = 1Vetor Ordenado
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 lugaresA última passada  (h=1) corresponde ao algoritmo de inserção, mas apenas trocas locais serão executadas.Entendendo
Ninguemdescobriuatéhoje a sequenciaperfeitaparautilizaçãonestecaso, váriasforamestudadas.Os melhoresresultadosforamobtidosusando a sequência de Knuth:(1, 4, 13, 40, 121, 364, 1093)Comece com h = 1Obtenhaumasequencia de númerosusandoh = 3*h + 11, 4, 13, 40, 121, 364, 1093Pare quandoh for maiorque o tamanho do array e use o últimonumeroobtido.Para se obter a sequenciaemordemdecrescenteparaaplicaraoalgoritmo, use a fórmulainversaaonumeroobtido:h = (h – 1) / 3Como Obter H:
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
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:
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:

ShellSort - Ordenação

  • 1.
    ShellsortAnderson Zardo |Jean Carlo Soares
  • 2.
    Criado por DonaldShell (daí o nome Shell) em 1959, publicado pela Universidade de Cincinnati.Como surgiu?
  • 3.
    Shellsort é derivadodo Algoritmo de Inserção.Inserção apenas faz trocas adjacentesPior caso: fazer n-1 trocasJá O Shell faz trocas a uma certa distância (que diminui a cada passada)Levar, mais rápido, para o ponto corretoComo funciona?
  • 4.
    Primeiro compara elementosseparados 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?
  • 5.
    ExemploO R D E N Ah = 4h = 2h = 1
  • 6.
  • 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 lugaresA última passada (h=1) corresponde ao algoritmo de inserção, mas apenas trocas locais serão executadas.Entendendo
  • 8.
    Ninguemdescobriuatéhoje a sequenciaperfeitaparautilizaçãonestecaso,váriasforamestudadas.Os melhoresresultadosforamobtidosusando a sequência de Knuth:(1, 4, 13, 40, 121, 364, 1093)Comece com h = 1Obtenhaumasequencia de númerosusandoh = 3*h + 11, 4, 13, 40, 121, 364, 1093Pare quandoh for maiorque o tamanho do array e use o últimonumeroobtido.Para se obter a sequenciaemordemdecrescenteparaaplicaraoalgoritmo, use a fórmulainversaaonumeroobtido:h = (h – 1) / 3Como Obter H:
  • 9.
    Velocidade: em sequenciasmoderadas é 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: