CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS Algoritmos de ordenação: Inserção e Shellsort Algoritmos e Estruturas de Dados I 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). Natália Batista https://sites.google.com/site/nataliacefetmg/ nataliabatista@decom.cefetmg.br 2º semestre/ 2017
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 Fonte:http://cae.ucb.br/conteudo/programar/l abor1/new_ordenacaoepesquisa.html 2
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. 3
O método é ilustrado abaixo: As chaves em negrito representam a sequência destino. 4
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. 5
6
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 7
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 é: 8
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 9
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 10
Caso médio: assume que todas as permutações de n são igualmente prováveis. 11
O anel mais externo (for) realiza n-1 iterações: Logo, o número de comparações é igual a: 12
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 é: 13
M O V I M E N T A Ç Õ E S C i (n)-1: subtrai 1 pois faz uma comparação a mais para sair do while. 14
O número total de movimentações é calculado por: 15
Exemplo de pior caso: 16
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. 17
É 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. 18
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 trocas de registros distantes um do outro. 19
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. 20
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. Observação: usando a sequência h = 1, 2, 4. 21
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 sequência é difícil de ser batida por mais de 20% em eficiência. 22
2. Shellsort 23
2. Shellsort Quando h = 1, o Shellsort corresponde ao algoritmo de inserção. 24
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. 25
2. Shellsort A implementação do Shellsort não utiliza registros sentinelas. Seriam necessários h registros sentinelas, uma para cada h-ordenação. 26
2. Shellsort Conjecturas referente ao número de comparações para a sequência de Knuth: 27
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. O método não é estável. 28
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. Menotti, D. Ordenação. Notas de aula, 2009. 29