Prof. Rodrigo L. S. Silva, D.Sc. Prof. Stênio Sã R. F. Soares, D.Sc.
Métodos de ordenação
2
O que será visto nesta aula?
O que são métodos de ordenação.
Classificação dos métodos.
Funcionamento de alguns métodos
3
Métodos de Ordenação
Métodos de ordenação tem por objetivo
rearranjar um conjunto de objetos em uma
ordem crescente ou decrescente.
Tem como objetivo facilitar a recuperação dos
itens do conjunto.
Ordenar objetos é uma atividade relevante e
fundamental em diversas aplicações da
computação.
4
Chaves
A comparação é feita através de algum tipo de
chave.
Em vetores simples, os próprios elementos do
vetor (sejam eles números ou caracteres) são
as chaves.
Em problemas mais complexos, usualmente a
chave é um campo numérico dentro de uma
estrutura ou classe (como um “CPF” em uma
estrutura “pessoa” por exemplo).
5
Classificação:
Quanto ao conjunto de registros
Ordenação Interna: o conjunto de registros
cabe todo na memória principal.
Ordenação Externa: o conjunto de registros não
cabe completamente em memória principal, e
deve ser armazenado em disco ou fita.
6
Ordenação Interna
Medidas de complexidade levam em conta:
O número de comparação entre as chaves O número de trocas entre os itens
São classificados em dois tipos:
Métodos Simples: mais recomendados para
conjuntos pequenos de dados. Usam mais comparações, mas produzem códigos menores e mais simples;
Métodos Eficientes: adequados para conjuntos
maiores de dados. Usam menos comparações, porém produzem códigos mais complexos e com muitos detalhes.
7
Alguns Algoritmos...
Ordenação por Seleção (Selection Sort) Ordenação por Inserção (Insertion Sort)
Ordenação por Seleção e Troca (Bubble Sort) Ordenação por Inserção através de
incrementos decrescentes (ShellSort)
Ordenação por Particionamento (QuickSort) Ordenação de Árvores (HeapSort)
Métodos Simples
Métodos Eficientes
8
Ordenação por Seleção
(Selection Sort)
Um dos algoritmos mais simples.
Mais recomendado para conjuntos pequenos
Procedimento:
Selecione o menor item do conjunto e troque-o
com o item que está na posição i.
Repita essas operações com os demais itens até
9
Ordenação por Seleção
(Selection Sort)
O R D E N A
1 2 3 4 5 6
10
Ordenação por Seleção
(Selection Sort)
O R D E N A
1 2 3 4 5 6
Chaves Iniciais:
11
Ordenação por Seleção
(Selection Sort)
O R D E N A 1 2 3 4 5 6 Chaves Iniciais: i=1: A R D E N O A D R E N O i=2:12
Ordenação por Seleção
(Selection Sort)
O R D E N A 1 2 3 4 5 6 Chaves Iniciais: i=1: A R D E N O A D R E N O A D E R N O i=2: i=3:13
Ordenação por Seleção
(Selection Sort)
O R D E N A 1 2 3 4 5 6 Chaves Iniciais: i=1: A R D E N O A D R E N O A D E R N O A D E N R O i=2: i=3: i=4:14
Ordenação por Seleção
(Selection Sort)
O R D E N A 1 2 3 4 5 6 Chaves Iniciais: i=1: A R D E N O A D R E N O A D E R N O A D E N R O A D E N O R i=2: i=3: i=4: i=5:15
Ordenação por Seleção
(Selection Sort)
Vantagem
Um dos algoritmos mais simples de se
implementar.
Desvantagem
É um algoritmo lento ( O(n2) ) se comparado a
16
Ordenação por Inserção
(Insertion Sort)
Procedimento
1. Os elementos são divididos em uma seqüência de
destino a1, ..., ai-1 e em uma seqüência fonte ai, ..., an.
2. Em cada passo, a partir de i =2, o i-ésimo item da
sequência fonte é retirado e transferido para a seqüência destino na posição adequada.
Pode-se utilizar um único vetor para fazer todo
17
Ordenação por Inserção (Insertion
Sort)
A O R D E N 6 2 3 4 5 1 Chaves Iniciais O R A O R D E N i = 218
Ordenação por Inserção (Insertion
Sort)
A O R D E N 6 2 3 4 5 1 i = 3 O R D E N A Chaves Iniciais O R A O R D E N i = 219
A O O R E N A D O R E N
i = 4
Ordenação por Inserção (Insertion
Sort)
A O R D E N 6 2 3 4 5 1 i = 3 O R D E N A Chaves Iniciais O R A O R D E N i = 220
A O O R E N A D O R E N
i = 4
Ordenação por Inserção (Insertion
Sort)
A O R D E N 6 2 3 4 5 1 i = 3 O R D E N A A D E O R N i = 5 Chaves Iniciais O R A O R D E N i = 221
A O O R E N A D O R E N
i = 4
Ordenação por Inserção (Insertion
Sort)
A O R D E N 6 2 3 4 5 1 i = 3 O R D E N A A D E O R N i = 5 A D E N O R i = 6 Chaves Iniciais O R A O R D E N i = 222
A O O R E N A D O R E N
i = 4
Ordenação por Inserção (Insertion
Sort)
A O R D E N 6 2 3 4 5 1 i = 3 O R D E N A A D E O R N i = 5 A D E N O R i = 6 R A D E N O Res.: Chaves Iniciais O R A O R D E N i = 223
Ordenação por Inserção (Insertion
Sort)
A inserção do item em uma posição adequada na
sequência de destino é realizada com a movimentação das chaves maiores para a direita e então é feita a inserção do item na posição vazia.
Vantagens:
O número mínimo de comparações e movimentos ocorre
quando os itens já estão originalmente ordenados.
O número máximo ocorre quando os itens estão
originalmente em ordem reversa, o que indica um comportamento natural para o algoritmo.
24
Ordenação por Seleção e Troca
(
Bubblesort ou método da Bolha)
Princípio:
1. As chaves Item[1].Chave e Item[2].Chave são
comparadas e trocadas se estiverem fora de ordem;
2. Repete-se o processo de comparação e troca com
Item[2] e Item[3], Item[3] e Item[4], ...
Curiosidade: Por que este algoritmo é chamado
de BubbleSort?
Se o vetor a ser ordenado for colocado na vertical,
com Item[n] em cima e Item[1] embaixo, durante cada passo o menor elemento “sobe” até encontrar um elemento maior ainda, como se uma bolha subisse dentro de um tubo de acordo com sua densidade.
25
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7
26
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7
44 55 12 42 94 18 6 67
27
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7
44 55 12 42 94 18 6 67
44 12 42 55 18 6 67 94
28
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7
44 55 12 42 94 18 6 67
44 12 42 55 18 6 67 94
12 42 44 18 6 55 67 94
29
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7 44 55 12 42 94 18 6 67 44 12 42 55 18 6 67 94 12 42 44 18 6 55 67 94 12 42 18 6 44 55 67 94 12 18 6 42 44 55 67 94
30
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7 44 55 12 42 94 18 6 67 44 12 42 55 18 6 67 94 12 42 44 18 6 55 67 94 12 42 18 6 44 55 67 94 12 18 6 42 44 55 67 94 12 6 18 42 44 55 67 94
31
Ordenação pelo Método da Bolha
0 1 2 3 4 5 6 7 44 55 12 42 94 18 6 67 44 12 42 55 18 6 67 94 12 42 44 18 6 55 67 94 12 42 18 6 44 55 67 94 12 18 6 42 44 55 67 94 12 6 18 42 44 55 67 94 6 12 18 42 44 55 67 94
32
Observações
Método extremamente lento: só faz comparações
entre posições adjacentes
É o método mais ineficiente entre os simples
Melhor caso: vetor já ordenado
33
ShellSort
Método proposto por Shell em 1959.
É uma extensão da ordenação por inserção.
Utiliza a ordenação por inserção sobre
subsequências periódicas da entrada para
produzir um algoritmo de ordenação mais rápido.
O Shellsort contorna o problema permitindo
trocas de registros que estão distantes um do
outro. Os itens que estão separados h posições são
rearranjados de forma que todo h-ésimo item leva
a uma sequência ordenada.
34
Ordenação por Inserção
A O R D E N 6 2 3 4 5 1 Chaves Iniciais
35
Ordenação por Inserção
A O R D E N 6 2 3 4 5 1 Chaves Iniciais h = 4
36
Ordenação por Inserção
A O R D E N 6 2 3 4 5 1 h = 4 N A D E O R Chaves Iniciais
37
Ordenação por Inserção
A O R D E N 6 2 3 4 5 1 h = 4 N A D E O R Chaves Iniciais h = 2
38
Ordenação por Inserção
A O R D E N 6 2 3 4 5 1 h = 4 N A D E O R Chaves Iniciais R D A N E O h = 2
39
Ordenação por Inserção
A O R D E N 6 2 3 4 5 1 h = 4 N A D E O R Chaves Iniciais R D A N E O h = 2 R A D E N O h = 1
40
Entendendo o Shellsort
1. Na primeira passada (h=4), o item de valor O (posição
1) é comparado com o item de valor N (posição 5) e como o último é menor, são trocados.
O item R é a seguir comparado e trocado com A (posições
2 e 6) seguindo a mesma lógica.
2. Na segunda passada (h=2), N, D e O, nas posições 1, 3
e 5 são rearrumados para resultar em D, N e O nestas mesmas posições; da mesma forma, A, E e R, nas posições 2, 4 e 6 são comparados e mantidos nos seus lugares por já estarem na ordem correta.
3. A última passada (h=1) corresponde ao algoritmo de
41
Quicksort
O Quicksort é um dos mais populares
algoritmos eficientes para ordenação interna.
Princípio
1. Dividir o problema de ordenar um conjunto de n
itens em dois problemas menores.
2. Ordenar independentemente os problemas
menores.
3. Combinar os resultados para produzir a solução
42
Partição
A parte mais delicada desse método se refere
à divisão da partição
Deve-se rearranjar o vetor na forma A[Esq..Dir]
através da escolha arbitrária de um item x do vetor chamado pivô.
Ao final, o vetor A deverá ter duas partes, uma
esquerda com chaves menores ou iguais que x e a direita com valores de chaves maiores ou iguais que x.
43
Algoritmo Quicksort: Partição
Procedimento do Algoritmo QuickSort
1. Escolher arbitrariamente um item do vetor e colocar
este valor em x
2. Percorrer o vetor a partir da esquerda até que um
item A[i] x é encontrado; da mesma maneira, percorrer o vetor a partir da direita até que um item
A[j] x é encontrado;
3. Como os itens A[i] e A[j] não estão na ordem correta
no vetor final, eles devem ser trocados
4. Continuar o processo até que os índice i e j se cruzem
44
Funcionamento do Quicksort:
Partição
Ao final do processo, o vetor A[Esq..Dir] está
particionado de tal forma que:
Os itens em A[Esq], A[Esq+1],..., A[j] são menores
ou iguais a x
Os itens em A[i], A[i+1],..., A[Dir] são maiores ou
45
Exemplo de Partição
A O R D E N 6 2 3 4 5 1 i = 2 A R D E N O O A D R E N i = 3 Chaves Iniciais D O pivô é escolhido como sendo A[(i+j) div 2]
Inicialmente, i=1 e j=6, e então x=A[3] = D
A varredura a partir da posição 1 pára no item O e a varredura a
partir da posição 6 pára em A, sendo os dois itens trocados
A varredura a partir da posição 2 pára em R e a varredura a partir
da posição 5 pára no item D, e então os dois itens são trocados
Neste instante i e j se cruzam (i=3 e j=2), o que encerra o processo
46
Procedimento (após Partição)
A O R D E N 6 2 3 4 5 1 i = 1 A D R E N O O E R N i = 3 O N R i = 4 R O i = 5 Chaves Iniciais A D i = 2 R A D E N O i = 6
47
Análise
Melhor caso: quando cada partição divide o
arquivo em duas partes iguais
Pontos fracos:
A implementação do algoritmo é mais
complicada do que os algoritmos vistos anteriormente.
Entretanto, desde que se tenha uma
implementação robusta o suficiente, o
Quicksort é uma boa opção para problemas
Leitura obrigatória