Você está na página 1de 33

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
nataliabatista@cefetmg.br

1º semestre/ 2022
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-um-
 baralho-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

 O princípio do Radixsort é baseado na


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

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

9
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

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

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

12
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.
13
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.

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

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

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

17
7. Algoritmos de ordenação interna

 Exemplos:
 Ordenação por seleção.
 Ordenação por inserção.
 Bubblesort.
 Shellsort.
 Mergesort.
 Quicksort.
 Heapsort.

18
7. Algoritmos de ordenação interna

 Classificação dos métodos de ordenação interna:


 Métodos simples:
 Adequados para pequenos arquivos.
 Requerem O(n2) 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.

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

20
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.
21
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

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

23
8. Ordenação por seleção
 O método é ilustrado abaixo:

 As chaves em negrito sofreram uma troca entre si.

24
8. Ordenação por seleção

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

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

27
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):

(Ziviani)

28
8. Ordenação por seleção
 Se considerarmos o número de comparações
como a medida de custo relevante, o programa
faz n2/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.

29
8. Ordenação por seleção

Fonte: Ziviani.

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

31
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

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

33

Você também pode gostar