Algoritmos de ordenação:
Bubblesort e Mergesort
Algoritmos e Estruturas de Dados I
Natália Batista
https://sites.google.com/site/nataliacefetmg/
nataliabatista@decom.cefetmg.br
2º semestre/ 2017
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS
Slides adaptados dos slides do livro texto (Ziviani) e dos slides de aula dos professores Davi Menotti (DECOM/UFOP), Antônio Alfredo Ferreira Loureiro (DCC/UFMG) e Jairo Francisco de Souza (UFJF).
2
1. Bubblesort
Princípio:
Chaves na posição 1 e 2 são comparadas e trocadas se estiverem fora de ordem.
Processo é repetido com as chaves 2 e 3, até
n − 1 e n.
3
1. Bubblesort
Método da Bolha.
Se desenharmos o vetor de
armazenamento verticalmente, com A[n] em cima e A[1] embaixo, durante um passo do algoritmo, cada registro
“sobe” até encontrar outro com chave maior, que por sua vez sobe até
encontrar outro maior ainda, etc, com um movimento semelhante a uma bolha subindo em um tubo de ensaio.
Fonte: http://clipart-library.com/data_images/27367.jpg
4
1. Bubblesort
Algoritmo: void Bubblesort(int *A, int n) {
int i, j;
int aux;
for (j=0; j<n-1; j++){
for (i=0; i<n-1; i++){
if (A[i] > A[i+1]){
aux = A[i];
A[i] = A[i+1];
A[i+1] = aux;
}
}
}
}
5
1. Bubblesort
Exemplo: considere um vetor com 8 elementos (numerados de 1 a 8).
1 2 3 4 5 6 7 8
44 55 12 42 94 18 6 67
6
1. Bubblesort
7
1. Bubblesort
8
1. Bubblesort
9
1. Bubblesort
10
1. Bubblesort
11
1. Bubblesort
12
1. Bubblesort
13
1. Bubblesort
14
1. Bubblesort
15
1. Bubblesort
16
1. Bubblesort
17
1. Bubblesort
18
1. Bubblesort
19
1. Bubblesort
20
1. Bubblesort
21
1. Bubblesort
22
1. Bubblesort
23
1. Bubblesort
24
1. Bubblesort
25
1. Bubblesort
As iterações continuam de forma semelhante...
26
27
As iterações continuam mas o vetor já está ordenado...
28
1. Bubblesort
Este método faz tantas trocas que o tornam o mais ineficiente de todos os métodos simples ou diretos.
Método lento:
Só compara posições adjacentes.
Cada passo aproveita muito pouco do que foi
“aprendido” sobre o arquivo no passo anterior.
Comparações redundantes em excesso
devido a uma sequência fixa de comparações.
29
1. Bubblesort
Melhor caso: C(n) = O(n 2 )
Ocorre quando o arquivo está completamente ordenado, fazendo n − 1 comparações e
nenhuma troca em cada iteração do anel externo.
Pior caso: C(n) = O(n 2 )
Ocorre quando o arquivo está em ordem reversa,
ou seja, quando o k-ésimo passo faz n − k trocas
em cada iteração do anel externo.
30
1. Bubblesort
Outras versões melhoradas do Bubblesort são mais eficientes:
O(n) no melhor caso no número de comparações.
O algoritmo pode ser melhorado considerando o fato de que na j-ésima iteração o maior elemento é encontrado e colocado em seu lugar definitivo no vetor.
Logo, todos os elementos que estão após a
última troca já estão ordenados.
31
1. Bubblesort
Vantagens:
Simplicidade do algoritmo.
Estável.
Desvantagens:
Lentidão.
Indicações:
Tabelas muito pequenas.
Quando se sabe que a tabela está quase ordenada.
Demonstrações didáticas.
32
2. Mergesort
Intercalação: operação de unir dois arquivos ordenados gerando um terceiro arquivo ordenado (merge).
Consiste em colocar no terceiro arquivo o menor elemento entre os menores dos dois arquivos iniciais, desconsiderando este mesmo elemento nos passos posteriores.
Este processo deve ser repetido até que todos
os elementos dos arquivos de entrada sejam
escolhidos.
33
2. Mergesort
Exemplo de intercalação:
34
2. Mergesort
Abordagem divisão e conquista:
Dividir a entrada em conjuntos menores
Resolver cada instância menor de maneira recursiva
Reunir as soluções parciais para compor a
solução do problema original.
35
2. Mergesort
Princípio:
Dividir recursivamente o vetor a ser ordenado em dois vetores até obter n vetores de um único
elemento.
Intercalar dois vetores de um elemento formando um vetor ordenado de dois elementos.
Repetir o processo formando vetores cada vez
maiores, até ordenar todo o vetor.
36
Fonte: VineetKumar at English Wikipedia - Transferred from en.wikipedia to Commons by Eric Bauman using CommonsHelper., Public Domain, https://commons.wikimedia.org/w/index.php?curid=8004317
37
2. Mergesort
Considere a sequência de inteiros v[0..n-1] = a 0 , a 1 , ..., a n-1 .
Considere n como uma potência de 2.
Intercalação: método merge
Recebe como entrada duas sequências ordenadas v[i..m] e v[m+1..j].
Produz outra sequência ordenada com os
elementos das sequências de entrada.
38
2. Mergesort
Método merge(v, i, m, j):
Seleciona repetidamente o menor dentre os menores elementos restantes em v[i..m] e v[m+1..j].
Quando houver empate, retira de uma delas.
Requer n-1 comparações, onde n é o número
total de elementos em v[i..j].
39
2. Mergesort
void Merge(Vetor A, int i, int m, int j){
Vetor B;
int x;
int k = i;
int l = m+1;
for (x=i;x<=j;x++) B[x] = A[x];
x = i;
while (k<=m && l<=j) { if (B[k] <= B[l]) A[x++] = B[k++];
else
A[x++] = B[l++];
}
while (k<=m) A[x++] = B[k++];
while (l<=j) A[x++] = B[l++];
}
40
2. Mergesort
Método mergesort(v, i, j):
ordena a subsequência de inteiros v[i..j] = a
i, a
i+1, ..., a
j,
assumindo que seu comprimento é 2
kpara algum
k ≥ 0.
41
2. Mergesort
void Mergesort(Vetor A, int i, int j){
int m;
if (i < j){
m = (i + j - 1) / 2;
Mergesort(A, i, m);
Mergesort(A, m + 1, j);
Merge(A, i, m, j);
/*Intercala A[i..m] e A[m+1..j] em A[i..j] */}
}
42
2. Mergesort
6 2 8 5 10 9 12 1 15 7 3 13 4 11 16 14
2 6 8 5 10 9 12 1 15 7 3 13 4 11 16 14
2 6 5 8 10 9 12 1 15 7 3 13 4 11 16 14
2 5 6 8 10 9 12 1 15 7 3 13 4 11 16 14
2 5 6 8 9 10 12 1 15 7 3 13 4 11 16 14
2 5 6 8 9 10 1 12 15 7 3 13 4 11 16 14
2 5 6 8 1 9 10 12 15 7 3 13 4 11 16 14
1 2 5 6 8 9 10 12 15 7 3 13 4 11 16 14
1 2 5 6 8 9 10 12 7 15 3 13 4 11 16 14
1 2 5 6 8 9 10 12 7 15 3 13 4 11 16 14
1 2 5 6 8 9 10 12 3 7 13 15 4 11 16 14
1 2 5 6 8 9 10 12 3 7 13 15 4 11 16 14
1 2 5 6 8 9 10 12 3 7 13 15 4 11 14 16
1 2 5 6 8 9 10 12 3 7 13 15 4 11 14 16
1 2 5 6 8 9 10 12 3 4 7 11 13 14 15 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
43
2. Mergesort
Análise: na contagem de comparações, o
comportamento do Mergesort pode ser
representado por
44
2. Mergesort
45
2. Mergesort
Adicionando lado a lado:
Pela condição de parada T(1) = 0, temos que:
T(n/2
i) = 0.
Logo i = log n.
46
2. Mergesort
E usando o somatório:
47
2. Mergesort
Temos que:
48
2. Mergesort
Vantagens:
MergeSort é O(n log n).
Indicado para aplicações que exigem restrição de tempo.
Estável.
Fácil Implementação.
Desvantagens:
Utiliza memória auxiliar.
49
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.
Souza, J. F. Método BubbleSort. Notas de aula, 2016.