CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS Algoritmos de ordenação: Bucketsort, Radixsort e Seleção Algoritmos e Estruturas de Dados I Natália Batista https://sites.google.com/site/nataliacefetmg/ nataliabatista@decom.cefetmg.br 2º semestre/ 2017
1. Introdução (1/5) Ordenar: processo de rearranjar um conjunto de objetos em ordem ascendente ou descendente. A ordenação visa facilitar a recuperação posterior de itens do conjunto ordenado. Aplicações: catálogo telefônico dicionários índices de livros tabelas e arquivos, etc. Fonte:http://cae.ucb.br/conteudo/programar/labor1/new _ordenacaoepesquisa.html 2
1. Introdução (1/5) A maioria dos métodos de ordenação é baseada em comparações das chaves. Existem métodos de ordenação que utilizam o princípio da distribuição. Exemplo: ordenar as cartas de um baralho. 3
2. Ordenação por distribuição Exemplo: considere o problema de ordenar um baralho com 52 cartas na ordem 4
2. Ordenação por distribuição Algoritmo: Fonte: https://hypescience.com/existem-mais-combinacoes-em-umbaralho-de-cartas-do-que-estrelas-no-universo/ 1. Distribuir as cartas em treze montes: ases, dois, três,..., reis. 2. Colete os montes na ordem citada (às no fundo). 3. Distribua novamente as cartas em quatro montes: paus, ouros, copas e espadas. 4. Colete os montes na ordem especificada. 5
2. Ordenação por distribuição Métodos como o ilustrado são também conhecidos como ordenação digital, Bucketsort ou Radixsort. O método não utiliza comparação entre chaves. Uma das dificuldades de implementar este método está relacionada com o problema de lidar com cada monte. Se para cada monte nós reservarmos uma área, então a demanda por memória extra pode tornar-se proibitiva. O custo para ordenar um arquivo com n elementos é da ordem de O(n). 6
3. Bucketsort Considere uma sequência de n itens cujas chaves são inteiros no intervalo [0, N-1]. As chaves são usadas como índices em um arranjo de buckets B que tem entradas de 0 a N-1. Um item com chave k é armazenado no bucket B[k]. Após inserir cada item em seu bucket, pode-se colocar os itens de volta na sequência de forma ordenada pela enumeração do conteúdo dos buckets B[0], B[1],..., B[N-1]. Fonte: https://en.wikipedia.org/wiki/bucket_sort 7
4. Radixsort Ordena uma sequência de pares aplicando um Bucketsort estável sobre a sequência duas vezes: primeiro usando um componente do par como chave de ordenação; em seguida empregando o segundo componente. 8
5. Estabilidade Um método de ordenação é estável se a ordem relativa dos itens com chaves iguais não se altera durante a ordenação. Alguns dos métodos de ordenação mais eficientes não são estáveis. Exemplo: Se uma lista alfabética de nomes de funcionários de uma empresa é ordenada pelo campo salário, então um método estável produz uma lista em que os funcionários com mesmo salário aparecem em ordem alfabética. 9
5. Estabilidade A estabilidade pode ser forçada quando o método é não-estável. Sedgewick (1988) sugere agregar um pequeno índice a cada chave antes de ordenar, ou então aumentar a chave de alguma outra forma. 10
6. Classificação dos métodos de ordenação Ordenação interna: arquivo a ser ordenado cabe todo na memória principal. Ordenação externa: arquivo a ser ordenado não cabe na memória principal. Diferenças entre os métodos: Em um método de ordenação interna, qualquer registro pode ser imediatamente acessado. Em um método de ordenação externa, os registros são acessados sequencialmente ou em grandes blocos. 11
7. Algoritmos de ordenação interna Na escolha de um algoritmo de ordenação interna deve ser considerado o tempo gasto pela ordenação. Sendo n o número registros no arquivo, as medidas de complexidade relevantes são: Número de comparações C(n) entre chaves. Número de movimentações M (n) de itens do arquivo. 12
7. Algoritmos de ordenação interna O uso econômico da memória disponível é um requisito primordial na ordenação interna. Métodos de ordenação in situ são os preferidos: executam a permutação dos itens no próprio vetor. Métodos que utilizam listas encadeadas são menos utilizados: memória extra para ponteiros. Métodos que fazem cópias dos itens a serem ordenados possuem menor importância. 13
7. Algoritmos de ordenação interna Exemplos: Ordenação por seleção. Ordenação por inserção. Bubblesort. Shellsort. Mergesort. Quicksort. Heapsort. 14
7. Algoritmos de ordenação interna Classificação dos métodos de ordenação interna: Métodos simples: Adequados para pequenos arquivos. Requerem O(n 2 ) comparações. Fáceis de entender e implementar. Métodos eficientes: Adequados para arquivos maiores. Requerem O(n log n) comparações. As comparações são mais complexas nos detalhes. 15
7. Algoritmos de ordenação interna Notação utilizada: Os algoritmos trabalham sobre os registros de um arquivo. Cada registro possui uma chave utilizada para controlar a ordenação. Podem existir outros componentes em um registro. 16
7. Algoritmos de ordenação interna Estrutura de um registro: typedef long TipoChave; typedef struct TipoItem { TipoChave Chave; / outros componentes / } TipoItem ; Qualquer tipo de chave sobre o qual exista uma regra de ordenação bem definida pode ser utilizado. 17
7. Algoritmos de ordenação interna Tipos de dados e variáveis utilizados nos algoritmos de ordenação interna: typedef int TipoIndice ; typedef TipoItem TipoVetor [ MAXTAM + 1]; / MAXTAM + 1 por causa da sentinela em Insercao / TipoVetor A; O índice do vetor vai de 0 até MaxTam, devido às chaves sentinelas. O vetor a ser ordenado contém chaves nas posições de 1 até n. Fonte:https://www.designtoscano.com 18
8. Ordenação por seleção Um dos algoritmos mais simples de ordenação. Considere uma sequência A com n elementos: Seleciona o menor elemento do conjunto. Troca este elemento com A[1]. Repete as duas operações acima com os n 1 elementos restantes, depois com os n - 2, até que reste apenas um. 19
8. Ordenação por seleção O método é ilustrado abaixo: As chaves em negrito sofreram uma troca entre si. 20
8. Ordenação por seleção 21
8. Ordenação por seleção Anel interno Contém um comando de decisão, com um comando apenas de atribuição. Ambos levam tempo constante para serem executados. O tempo para incrementar o índice do anel e avaliar sua condição de terminação é O(1). 22
8. Ordenação por seleção O tempo combinado para executar uma vez o anel é O(max(1, 1, 1)) = O(1), conforme regra da soma para a notação O. Como o número de iterações é n-i, o tempo gasto no anel é O((n-i)x1) = O(n - i), conforme regra do produto para a notação O. 23
8. Ordenação por seleção Anel externo: Contém, além do anel interno, quatro comandos de atribuição: O(max(1, (n - i), 1, 1, 1)) = O(n - i). O anel é executado n-1 vezes e o tempo total para executar o programa está limitado ao produto de uma constante pelo somatório de (n - i): 24 (Ziviani)
8. Ordenação por seleção Se considerarmos o número de comparações como a medida de custo relevante, o programa faz n 2 /2 + n/2 comparações para ordenar n elementos. Considerarmos o número de movimentos de registros, o programa realiza exatamente 3(n 1) movimentações. 25
8. Ordenação por seleção Fonte: Ziviani. 26
8. Ordenação por seleção Vantagens: Custo linear para o número de movimentos de registros. É o algoritmo a ser utilizado para arquivos com registros muito grandes. É muito interessante para arquivos com um número pequeno de registros. Desvantagens: O fato de o arquivo já estar ordenado não ajuda em nada, pois o custo continua quadrático. O algoritmo não é estável. 27
8. Ordenação por seleção Exemplo: 1 2 3 4 5 Chaves iniciais 2 2 1 4 3 i = 1 1 2 2 4 3 i = 2 1 2 2 4 3 i = 3 1 2 2 4 3 i = 4 1 2 2 3 4 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