• Nenhum resultado encontrado

Algoritmos de ordenação: Bucketsort, Radixsort e Seleção

N/A
N/A
Protected

Academic year: 2022

Share "Algoritmos de ordenação: Bucketsort, Radixsort e Seleção"

Copied!
33
0
0

Texto

(1)

Algoritmos de ordenação:

Bucketsort, Radixsort e Seleção

Algoritmos e Estruturas de Dados I

Natália Batista

https://sites.google.com/site/nataliacefetmg/

[email protected]

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS

(2)

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/

(3)

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.

(4)

2. Ordenação por distribuição

 Exemplo: considere o problema de ordenar

um baralho com 52 cartas na ordem

(5)

2. Ordenação por distribuição

Algoritmo:

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.

Fonte: https://hypescience.com/existem-mais-combinacoes-em-um- baralho-de-cartas-do-que-estrelas-no-universo/

(6)

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).

(7)

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

(8)

4. Radixsort

 O princípio do Radixsort é baseado na

ordenação das chaves de acordo com os dígitos que as compõem.

Ordenação digital

(9)

4. Radixsort

 Exemplo: ordenação usando o Radixsort em uma lista de sete números com 3 dígitos. As colunas em cinza indicam a posição do dígito sendo ordenado.

Fonte: CLRS.

(10)

4. Radixsort

 Algoritmo (CLRS): considere que cada

elemento do vetor A possui d dígitos, onde o dígito 1 é o menos significativo e o dígito d é o mais significativo. O vetor A possui n

elementos.

Radix-Sort(A, d) for i=1 to d

use um algoritmo de ordenação estável para ordenar o vetor A pelo dígito i

(11)

4. Radixsort

 Utilizado também para ordenar registros cujas chaves podem possuir múltiplos campos.

 Exemplo 1: Ordenar datas de acordo com o ano, o mês e o dia.

Três passadas de um algoritmo de ordenação

estável: primeiro ordena-se pelo dia, depois pelo

mês e finalmente pelo ano.

(12)

4. Radixsort

 Exemplo 2: Ordenação de 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.

(13)

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.

(14)

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.

(15)

6. Classifcaçã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.

(16)

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.

(17)

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.

(18)

7. Algoritmos de ordenação interna

 Exemplos:

Ordenação por seleção.

Ordenação por inserção.

Bubblesort.

Shellsort.

Mergesort.

Quicksort.

Heapsort.

(19)

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.

(20)

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.

(21)

7. Algoritmos de ordenação interna

 Estrutura de um registro:

 Qualquer tipo de chave sobre o qual exista uma regra de ordenação bem definida pode ser

utilizado.

typedef long TipoChave;

typedef struct TipoItem { TipoChave Chave;

/∗ outros componentes ∗/

} TipoItem ;

(22)

7. Algoritmos de ordenação interna

Tipos de dados e variáveis utilizados nos algoritmos de ordenação interna:

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.

typedef int TipoIndice ;

typedef TipoItem TipoVetor [ MAXTAM + 1];

/∗ MAXTAM + 1 por causa da sentinela em Insercao ∗/

TipoVetor A;

(23)

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.

(24)

8. Ordenação por seleção

O método é ilustrado abaixo:

As chaves em negrito sofreram uma troca entre si.

(25)

8. Ordenação por seleção

(26)

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).

(27)

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.

(28)

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 externo é executadao n-1 vezes, e o tempo total para executar o programa está limitado ao

produto de uma constante pelo somatório de (n - i):

(29)

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.

(30)

8. Ordenação por seleção

(31)

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.

(32)

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

(33)

Referências

Cormen, T. et al. Introduction to Algorithms. MIT Press, 2009.

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.

Ziviani, N. Projeto de algoritmos: com

implementações em Java e C++. 3 ed. Editora

Cengage Learning, 2007.

Referências

Documentos relacionados