algoritmo shell sort

17
Algoritmo Shell Sort Gabriel Ramalho Túlio Lemes Vinicius Rodrigues

Upload: gabriel-ramalho-de-albuquerque

Post on 01-Dec-2014

458 views

Category:

Software


0 download

DESCRIPTION

Análise de Algoritmos - Algoritmo Shell Sort

TRANSCRIPT

Page 1: Algoritmo Shell Sort

Algoritmo Shell Sort

Gabriel RamalhoTúlio Lemes

Vinicius Rodrigues

Page 2: Algoritmo Shell Sort

Dado certo número de elementos, informações ou dados, e a necessidade de termos que ordená-los em uma ordem predefinida, se faz necessária a utilização de algoritmos de ordenação. Dentre as várias razões para se ordenar uma sequência, uma delas é a possibilidade de acessar seus dados de uma maneira mais eficiente.

Motivação

Page 3: Algoritmo Shell Sort

Questão: Dado um vetor de elementos não ordenados deve-se ordená-los de acordo com uma função de comparação predefinida.

Entrada: Vetor de elementos não ordenados: L[n] = {e1, e2, e3, …, en}.

Saída: Vetor ordenado.

Descrição:

Page 4: Algoritmo Shell Sort

Visão Geral● Dividir o vetor em vetores menores, ordenando-os e fazendo isso

novamente para ter um único vetor praticamente ordenado e então trabalhar em cima dele, que seria mais prático e rápido

● O Shell Sort 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

Page 5: Algoritmo Shell Sort

Visão Geral● No algoritmo, a ordenação é realizada em vários passos, usando

uma sequência de valores do incremento de shell <h1, h2, h3…hN> onde começando por hN selecionamos apenas os valores que estão hN elementos distantes um do outro, então ordenamos esses elementos com algum algoritmo de ordenação simples como bolha, seleção ou inserção. Deste modo, apenas os elementos selecionados serão ordenados, os outros são todos ignorados.

Page 6: Algoritmo Shell Sort

Algoritmo Donald ShellFunção ShellSort(A, n)

aux, i, j, h = n/2;Enquanto h > 0

i = h;Enquanto i < n

aux = A[i]j = i;

Enquanto j >= h && aux < A[j - h]

A[j] = A[j - h];j = j - h;

A[j] = aux;i = i +1;

h = h/2;

Page 7: Algoritmo Shell Sort

Exemplo (Donald Shell):

n = 8h = 4

Page 8: Algoritmo Shell Sort

Exemplo (Donald Shell):

n = 8h = 2

Page 9: Algoritmo Shell Sort

Exemplo (Donald Shell):

n = 8h = 1

Page 10: Algoritmo Shell Sort

Exemplo (Donald Shell):

Resultado Final:

Page 11: Algoritmo Shell Sort

● Como escolher valores para h?○ Existem vários modos de escolher valores para h baseados em

estudos de eficiência○ O método de seleção de valores para h proposto por Donald

Shell foi h = n/2 onde n é o número de elementos do vetor, mas já foi provado que sua eficiência é baixa

○ O método de seleção de Donald Knuth, explicado como: h = 3 * h + 1

E a sequência gerada: 1, 4, 13, 40, 121, 364, 1093, 3280…

Page 12: Algoritmo Shell Sort

Algoritmo KnuthFunção ShellSort(A, n)

i, j , h = 1;

aux;

Enquanto h < n

h = h * 3 + 1;

Enquanto h > 1

h = (h – 1) / 3;

i = h;

Enquanto i < n

aux = A[i];

j = i – h;

Enquanto(j >= 0 && aux < A[j])

A[j + h] = A[j];

j = j – h;

A[j + h] = aux;

i = i + 1;

Page 13: Algoritmo Shell Sort

Prova de CorretudeSendo L uma lista de n elementos, com n >= 0:L[n] = { e0, e1, …, en }

Queremos demonstrar que qualquer que seja o valor dos elementos da lista L, através do algoritmo de inserção, a lista L será ordenada de acordo com uma função de comparação predefinida.

Para qualquer que seja o valor de h:

- sugerido por Shell: n/2, n/4, …, 1- sugerido por Knuth: …, 40, 13, 4, 1

o último valor de h será sempre 1, logo, para provar a corretude do algoritmo precisamos apenas que para em h = 1 o algoritmo esteja correto.

Page 14: Algoritmo Shell Sort

Prova de CorretudeConsiderando o algoritmo de inserção abaixo:

para j = 1 até n key = L[j] i = j - 1 enquanto i >= 0 e compara(L[i], key) L[i + 1] = L[i] i = i + 1 L[i+1] = key

Considere que L[0] é um valor já ordenado.Sendo assim, a cada iteração L[j] é colocado na posição correta e nenhum elemento de L[0..j] se move além de j.Logo, quando j = n + 1 então L[n] estará ordenado, como queríamos demonstrar.

Page 15: Algoritmo Shell Sort

Complexidade Pior Caso● Método de seleção de Donald Shell:

O(n²)

● Método de seleção de Donald Knuth:

O(n^3/2)

Page 16: Algoritmo Shell Sort

Conclusão:

Vantagens:•  Shell Sort é uma ótima opção para arquivos de tamanho moderado. •  Sua implementação é simples e requer uma quantidade de código

pequena.

Desvantagens:•  O tempo de execução do algoritmo é sensível à ordem inicial do arquivo.

•  O método não é estável.