Algoritmo Shell Sort
Gabriel Ramalho
Túlio Lemes
Vinicius Rodrigues
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
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:
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
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.
Algoritmo Donald Shell
Funçã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;
Exemplo (Donald Shell):
n = 8
h = 4
Exemplo (Donald Shell):
n = 8
h = 2
Exemplo (Donald Shell):
n = 8
h = 1
Exemplo (Donald Shell):
Resultado Final:
● 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…
Algoritmo Knuth
Funçã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;
Prova de Corretude
Sendo 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.
Prova de Corretude
Considerando 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.
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)
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.
Bibliografia:
● http://cadernogeek.wordpress.com/tag/shell-sort/
● http://www.decom.ufop.br/toffolo/site_media/uploads/2011-
2/bcc202/slides/19._shellsort.pdf
● http://www.lia.ufc.br/~valdisio/ed/PO2.pdf
● http://www.dsc.ufcg.edu.
br/~lbmarinho/slides/atal_2012_1/corretude_2012_1.pdf

Algoritmo Shell Sort

  • 1.
    Algoritmo Shell Sort GabrielRamalho Túlio Lemes Vinicius Rodrigues
  • 2.
    Dado certo númerode 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
  • 3.
    Questão: Dado umvetor 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:
  • 4.
    Visão Geral ● Dividiro 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
  • 5.
    Visão Geral ● Noalgoritmo, 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.
  • 6.
    Algoritmo Donald Shell FunçãoShellSort(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;
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
    ● Como escolhervalores 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…
  • 12.
    Algoritmo Knuth Funçã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;
  • 13.
    Prova de Corretude SendoL 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.
  • 14.
    Prova de Corretude Considerandoo 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.
  • 15.
    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)
  • 16.
    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.
  • 17.
    Bibliografia: ● http://cadernogeek.wordpress.com/tag/shell-sort/ ● http://www.decom.ufop.br/toffolo/site_media/uploads/2011- 2/bcc202/slides/19._shellsort.pdf ●http://www.lia.ufc.br/~valdisio/ed/PO2.pdf ● http://www.dsc.ufcg.edu. br/~lbmarinho/slides/atal_2012_1/corretude_2012_1.pdf