Trabalho ShellSort

11
Shellsort Anderson Zardo | Jean Carlo Soares

description

Trabalho sobre o algoritmo de ordenação Shell Sort

Transcript of Trabalho ShellSort

Page 1: Trabalho ShellSort

ShellsortAnderson Zardo | Jean Carlo Soares

Page 2: Trabalho ShellSort

Criado por Donald Shell (daí o nome Shell) em 1959, publicado pela Universidade de Cincinnati.

Como surgiu?

Page 3: Trabalho ShellSort

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?

Page 4: Trabalho ShellSort

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?

Page 5: Trabalho ShellSort

Exemplo

O R D E N A

h = 4

h = 2

h = 1

Page 6: Trabalho ShellSort

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

Page 7: Trabalho ShellSort

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

Page 8: Trabalho ShellSort

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:

Page 9: Trabalho ShellSort

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

Page 10: Trabalho ShellSort

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:

Page 11: Trabalho ShellSort

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: