Algoritmos de ordenação:
Inserção e Shellsort
Algoritmos e Estruturas de Dados I
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS
Slides adaptados dos slides do livro texto (Ziviani) e dos slides de aula dos professores Davi Menotti (DECOM/UFOP) e Antônio Alfredo Ferreira Loureiro (DCC/UFMG).
1. Ordenação por inserção
Algoritmo utilizado pelo jogador de cartas:
As cartas são ordenadas da esquerda para direita uma por uma.
O jogador escolhe a segunda carta e verifica se ela deve ficar antes ou na posição que está.
Depois a terceira carta é classificada, deslocando-a até sua correta posição.
O jogador realiza esse procedimento até
ordenar todas as cartas
1. Ordenação por inserção
Algoritmo:
Em cada passo a partir de i=2 faça:
Selecione o i-ésimo item da sequência fonte.
Coloque-o no lugar apropriado na sequência destino de
acordo com o critério de ordenação.
1. Ordenação por inserção
O método é ilustrado abaixo:
1. Ordenação por inserção
Considerações sobre o algoritmo:
O processo de ordenação pode ser terminado pelas condições:
Um item com chave menor que o item em consideração é encontrado.
O final da sequência destino é atingido à esquerda.
Solução: utilizar um registro sentinela na posição
zero do vetor.
1. Ordenação por inserção
1. Ordenação por inserção
Sentinela: na posição zero do vetor é colocado o próprio registro em consideração.
0 1 2 3 4 5 6
Chaves iniciais O R D E N A
i = 2 R O R D E N A
i = 3 D D O R E N A
i = 4 E D E O R N A
i = 5 N D E N O R A
i = 6 A A D E N O R
1. Ordenação por inserção
Seja C(n) a função que conta o número de comparações.
No anel mais interno (while), na i-ésima
iteração, o valor de C
ié:
1. Ordenação por inserção
Melhor caso: vetor já está ordenado.
C
i(n) = 1
0 1 2 3 4 5 6
Chaves iniciais A D E N O R
i = 2 D A D E N O R
i = 3 E A D E N O R
i = 4 N A D E N O R
i = 5 O A D E N O R
i = 6 R A D E N O R
1. Ordenação por inserção
Pior caso: vetor em ordem decrescente.
C
i(n) = i
0 1 2 3 4 5 6
Chaves iniciais R O N E D A
i = 2 O O R N E D A
i = 3 N N O R E D A
i = 4 E E N O R D A
i = 5 D D E N O R A
i = 6 A A D E N O R
1. Ordenação por inserção
Caso médio: assume que todas as
permutações de n são igualmente prováveis.
1. Ordenação por inserção
O anel mais externo (for) realiza n-1 iterações:
Logo, o número de comparações é igual a:
1. Ordenação por inserção
Seja M (n) a função que conta o número de movimentações de registros.
O número de movimentações na i-ésima
iteração é:
1. Ordenação por inserção
Ci(n)-1: subtrai 1 pois faz uma comparação a
mais para sair
M O V I M
E N T A Ç
1. Ordenação por inserção
O número total de movimentações é calculado por:
1. Ordenação por inserção
Exemplo de pior caso:
1. Ordenação por inserção
O número mínimo de comparações e movimentos ocorre quando os itens estão originalmente em ordem.
Para arquivos já ordenados o algoritmo descobre, a um custo O(n), que cada item já está no seu lugar.
O número máximo ocorre quando os itens
estão originalmente na ordem reversa.
1. Ordenação por inserção
É o método a ser utilizado quando o arquivo está “quase” ordenado.
É um bom método quando se deseja adicionar uns poucos itens a um arquivo ordenado, pois o custo é linear.
O algoritmo de ordenação por inserção é
estável.
2. Shellsort
Proposto por Shell em 1959.
É uma extensão do algoritmo de ordenação por inserção.
Problema com o algoritmo de ordenação por inserção:
Troca itens adjacentes para determinar o ponto de inserção.
São efetuadas n − 1 comparações e movimentações para encontrar ponto de inserção quando o menor item está na posição mais à direita no vetor.
O método de Shell contorna este problema permitindo
2. Shellsort
Itens que estão separados h posições são rearranjados de tal forma que todo h-ésimo item leva a uma sequência ordenada.
Ordenação por inserção através de
incrementos decrescentes.
2. Shellsort
Exemplo de utilização:
Posições 1 e 5 / 2 e 6
Posições 1, 3 e 5 / 2, 4 e 6 Corresponde ao inserção.
2. Shellsort
Como escolher o valor de h:
h(s) = 1, para s = 1.
h(s) = 3*h(s - 1) + 1, para s > 1.
A sequência para h corresponde a 1, 4, 13, 40, 121, 364, 1.093, 3.280, ...
Knuth (1973) mostrou experimentalmente que esta
2. Shellsort
2. Shellsort
Quando h = 1, o Shellsort corresponde ao
algoritmo de inserção.
2. Shellsort
Porque o Shellsort é mais eficiente?
A razão da eficiência do algoritmo ainda não é conhecida.
Sabe-se que cada incremento não deve ser múltiplo do anterior.
Várias sequências para h foram experimentadas.
2. Shellsort
A implementação do Shellsort não utiliza registros sentinelas.
Seriam necessários h registros sentinelas,
uma para cada h-ordenação.
2. Shellsort
Conjecturas referente ao número de
comparações para a sequência de Knuth:
2. Shellsort
Vantagens:
Shellsort é uma ótima opção para arquivos de tamanho moderado (± 10000 itens).
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.
Referências
Ziviani, N. Projeto de algoritmos: com implementações em Java e C++. 3 ed. Editora Cengage Learning, 2007.
Goodrich, M. T. e Tamassia, R. Estruturas de Dados
& Algoritmos. Editora Bookman, 2013.
Loureiro, A. A. F. Projeto e Análise de Algoritmos:
Análise de Complexidade. Notas de aula, 2010.