Trabalho ShellSort
-
Upload
anderson-zardo -
Category
Documents
-
view
10.372 -
download
10
description
Transcript of Trabalho ShellSort
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 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?
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?
Exemplo
O R D E N A
h = 4
h = 2
h = 1
Funcionamento
AO R D E N
62 3 4 51
h = 4
RN A D E O
RD A N E O
h = 2
RA D E N O
h = 1
Vetor Ordenado
1. 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)
2. 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
3. A última passada (h=1) corresponde ao algoritmo de inserção, mas apenas trocas locais serão executadas.
Entendendo
Ninguem descobriu até hoje a sequencia perfeita para utilização neste caso, várias foram estudadas.
Os melhores resultados foram obtidos usando a sequência de Knuth: (1, 4, 13, 40, 121, 364, 1093)
◦ Comece com h = 1◦ Obtenha uma sequencia de números usando h = 3*h + 1
1, 4, 13, 40, 121, 364, 1093◦ Pare quando h for maior que o tamanho do array e use o
último numero obtido.◦ Para se obter a sequencia em ordem decrescente para aplicar
ao algoritmo, use a fórmula inversa ao numero obtido:h = (h – 1) / 3
Como 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
void shellSort(int * vet, int size) { int i , j , value; int gap = 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:
void shellsort (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: