PROJETO DE EXTENSÃO I - AGRONOMIA.pdf AGRONOMIAAGRONOMIA
(ACH2002) Introdução à Análise de Algoritmos - Aula 15
1. Aula 15 – Algoritmos de Ordena¸c˜ao:
Divis˜ao e Conquista (MergeSort)
Norton Trevisan Roman
norton@usp.br
9 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 1 / 19
2. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
3. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
4. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
5. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
6. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Seja S um conjunto de n ≥ 2 valores. Podemos particionar
S em dois conjuntos, S1 e S2 , de tamanhos n/2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
7. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Seja S um conjunto de n ≥ 2 valores. Podemos particionar
S em dois conjuntos, S1 e S2 , de tamanhos n/2
Pela H.I., sabemos ordenar os conjuntos S1 e S2. Podemos
ent˜ao obter S ordenado intercalando os conjuntos ordenados
S1 e S2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
8. Projeto por Indu¸c˜ao Forte
Segunda Alternativa
Base: n = 1. Um conjunto de um ´unico elemento
est´a ordenado
H.I.: Sei ordenar um conjunto de 1 ≤ k < n valores
Passo:
Seja S um conjunto de n ≥ 2 valores. Podemos particionar
S em dois conjuntos, S1 e S2 , de tamanhos n/2
Pela H.I., sabemos ordenar os conjuntos S1 e S2. Podemos
ent˜ao obter S ordenado intercalando os conjuntos ordenados
S1 e S2
MergeSort
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 2 / 19
9. MergeSort
Passos para ordenar um arranjo A
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
10. MergeSort
Passos para ordenar um arranjo A
Dividir:
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
11. MergeSort
Passos para ordenar um arranjo A
Dividir:
Divida o arranjo de n elementos em dois sub-arranjos de n/2
elementos cada
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
12. MergeSort
Passos para ordenar um arranjo A
Dividir:
Divida o arranjo de n elementos em dois sub-arranjos de n/2
elementos cada
Conquistar:
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
13. MergeSort
Passos para ordenar um arranjo A
Dividir:
Divida o arranjo de n elementos em dois sub-arranjos de n/2
elementos cada
Conquistar:
Ordene os dois sub-arranjos recursivamente
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
14. MergeSort
Passos para ordenar um arranjo A
Dividir:
Divida o arranjo de n elementos em dois sub-arranjos de n/2
elementos cada
Conquistar:
Ordene os dois sub-arranjos recursivamente
Combinar:
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
15. MergeSort
Passos para ordenar um arranjo A
Dividir:
Divida o arranjo de n elementos em dois sub-arranjos de n/2
elementos cada
Conquistar:
Ordene os dois sub-arranjos recursivamente
Combinar:
Intercale os dois sub-arranjos ordenados, de modo a produzir
a resposta ordenada
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 3 / 19
16. MergeSort
Passos para ordenar um arranjo A
Podemos ver que a divis˜ao ´e imediata
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 4 / 19
17. MergeSort
Passos para ordenar um arranjo A
Podemos ver que a divis˜ao ´e imediata
O arranjo ´e dividido em dois sub-arranjos com metade do
tamanho do original, que s˜ao ordenados recursivamente
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 4 / 19
18. MergeSort
Passos para ordenar um arranjo A
Podemos ver que a divis˜ao ´e imediata
O arranjo ´e dividido em dois sub-arranjos com metade do
tamanho do original, que s˜ao ordenados recursivamente
A conquista tamb´em n˜ao ´e dif´ıcil
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 4 / 19
19. MergeSort
Passos para ordenar um arranjo A
Podemos ver que a divis˜ao ´e imediata
O arranjo ´e dividido em dois sub-arranjos com metade do
tamanho do original, que s˜ao ordenados recursivamente
A conquista tamb´em n˜ao ´e dif´ıcil
Inevitavelmente vamos parar no caso base, que ´e trivial
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 4 / 19
20. MergeSort
Passos para ordenar um arranjo A
Podemos ver que a divis˜ao ´e imediata
O arranjo ´e dividido em dois sub-arranjos com metade do
tamanho do original, que s˜ao ordenados recursivamente
A conquista tamb´em n˜ao ´e dif´ıcil
Inevitavelmente vamos parar no caso base, que ´e trivial
E a combina¸c˜ao?
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 4 / 19
21. MergeSort
Passos para ordenar um arranjo A
Podemos ver que a divis˜ao ´e imediata
O arranjo ´e dividido em dois sub-arranjos com metade do
tamanho do original, que s˜ao ordenados recursivamente
A conquista tamb´em n˜ao ´e dif´ıcil
Inevitavelmente vamos parar no caso base, que ´e trivial
E a combina¸c˜ao?
Como intercalar os 2 sub-arranjos ordenados?
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 4 / 19
22. MergeSort
Intercala¸c˜ao
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
23. MergeSort
Intercala¸c˜ao
Arranjo a ser ordenado
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
24. MergeSort
Intercala¸c˜ao
´ındices no arranjo,
sendo p ≤ q < r
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
25. MergeSort
Intercala¸c˜ao
O procedimento
assume que os sub-
arranjos A[p..q]
e A[q+1..r] j´a
est˜ao ordenados
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
26. MergeSort
Intercala¸c˜ao
Os sub-arranjos ser˜ao
ent˜ao intercalados
para formar um ´unico
sub-arranjo ordenado,
substituindo o sub-
arranjo A[p..r] atual
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
27. MergeSort
Intercala¸c˜ao
Tamanho da
sub-sequˆencia 1
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
28. MergeSort
Intercala¸c˜ao
Tamanho da
sub-sequˆencia 2
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
29. MergeSort
Intercala¸c˜ao
Copia A[p..q]
em seq1
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
30. MergeSort
Intercala¸c˜ao
E A[q+1..r] em seq2
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 5 / 19
31. MergeSort
Intercala¸c˜ao (cont.)
Juntamos agora
as subsequˆencias
...
k = p; i = 0; j = 0;
while (i < seq1.length && j < seq2.length) {
if(seq2[j] <= seq1[i]) {
A[k] = seq2[j];
j++;
}
else {
A[k] = seq1[i];
i++;
}
k++;
}
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 6 / 19
32. MergeSort
Intercala¸c˜ao (cont.)
O la¸co vai at´e terminar
a menor subsequˆencia
...
k = p; i = 0; j = 0;
while (i < seq1.length && j < seq2.length) {
if(seq2[j] <= seq1[i]) {
A[k] = seq2[j];
j++;
}
else {
A[k] = seq1[i];
i++;
}
k++;
}
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 6 / 19
33. MergeSort
Intercala¸c˜ao (cont.)
A[p...] recebe o
menor elemento dentre
as 2 subsequˆencias
...
k = p; i = 0; j = 0;
while (i < seq1.length && j < seq2.length) {
if(seq2[j] <= seq1[i]) {
A[k] = seq2[j];
j++;
}
else {
A[k] = seq1[i];
i++;
}
k++;
}
...
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 6 / 19
34. MergeSort
Intercala¸c˜ao (cont.)
Completa com a
subsequˆencia que
ainda n˜ao acabou
...
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 7 / 19
35. MergeSort
Intercala¸c˜ao (cont.)
Ou a primeira...
...
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 7 / 19
36. MergeSort
Intercala¸c˜ao (cont.)
Ou a segunda
...
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 7 / 19
37. MergeSort
Intercala¸c˜ao (cont.)
No final, a sub-
sequˆencia A[p..r]
est´a ordenada
...
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 7 / 19
38. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
39. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
Note que A[p..q] e A[q+1..r] est˜ao ordenados
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
40. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
Copiamos A[p..q] em seq1 e A[q+1..r] em seq2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
41. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
42. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
43. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
44. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 6 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
45. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
46. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 10 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
47. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
48. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 5 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
49. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
50. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 7 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
51. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 10 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
52. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 10 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
53. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 10 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
54. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 10 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
55. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 10 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
A[k] recebe o menor elemento dentre os 2 sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
56. MergeSort
Intercala¸c˜ao: Exemplo
Considere o arranjo A e os ´ındices p, q e r:
3 12 1 8 4 5 6 7 10 12 15 5 2 1 8A
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
p q r
4 6 10seq1
5 7 12 15seq2
E A[p..r] est´a ordenado
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 8 / 19
57. MergeSort
Vejamos agora o MergeSort completo
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 9 / 19
58. MergeSort
Vejamos agora o MergeSort completo
Dividir
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 9 / 19
59. MergeSort
Vejamos agora o MergeSort completo
Conquistar
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 9 / 19
60. MergeSort
Vejamos agora o MergeSort completo
Combinar
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 9 / 19
61. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
62. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fim
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
63. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fim
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
64. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
65. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
66. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
67. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
68. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
69. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
70. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
71. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
ini4
fim4
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
72. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
ini4
fim4
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
73. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
74. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
ini5
fim5
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
75. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
ini5
fim5
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
76. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
77. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
ini3 fim3
meio3
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
78. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
79. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
80. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
81. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
82. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
ini7
fim7
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
83. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
ini7
fim7
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
84. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
85. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
ini8
fim8
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
86. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
ini8
fim8
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
87. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 7 1 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
88. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 1 7 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
fim6ini6
meio6
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
89. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
2 8 1 7 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
90. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
ini2 fim2meio2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
91. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
92. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
93. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
94. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
95. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
96. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
97. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
98. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
ini11
fim11
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
99. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
ini11
fim11
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
100. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
101. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
ini12
fim12
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
102. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
ini12
fim12
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
103. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
104. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
ini10 fim10
meio10
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
105. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
106. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
107. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
108. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
109. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
ini14
fim14
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
110. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
ini14
fim14
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
111. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
112. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
ini15
fim15
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
113. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
ini15
fim15
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
114. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 6 4
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
115. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 4 6
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
fim13ini13
meio13
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
116. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 5 4 6
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
117. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 4 5 6
0 1 2 3 4 5 6 7
ini fimmeio
fim9ini9 meio9
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
118. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 7 8 3 4 5 6
0 1 2 3 4 5 6 7
ini fimmeio
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
119. MergeSort
C´odigo
void mergeSort(int[] numeros,
int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini,
meio);
mergeSort(numeros, meio+1,
fim);
merge(numeros, ini, meio,
fim);
}
}
1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7
ini fimmeio
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 10 / 19
120. MergeSort
Complexidade da Fus˜ao
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
Qual a
complexidade do
merge?
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 11 / 19
121. MergeSort
Complexidade da Fus˜ao
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
Qual a
complexidade do
merge?
Θ(n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 11 / 19
122. MergeSort
Complexidade da Fus˜ao
void merge(int[] A, int p, int q, int r) {
int i, j, k;
int tamseq1 = q - p + 1;
int tamseq2 = r - q;
int [] seq1 = new int [tamseq1];
for(i=0; i < seq1.length; i++)
seq1[i] = A[p+i];
int [] seq2 = new int [tamseq2];
for(j=0; j < seq2.length; j++)
seq2[j] = A[q+1+j];
Qual a
complexidade do
merge?
Θ(n)
+Θ(n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 11 / 19
123. MergeSort
Complexidade da Fus˜ao
k = p; i = 0; j = 0;
while (i < seq1.length && j < seq2.length) {
if(seq2[j] <= seq1[i]) {
A[k] = seq2[j];
j++;
}
else {
A[k] = seq1[i];
i++;
}
k++;
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 12 / 19
124. MergeSort
Complexidade da Fus˜ao
k = p; i = 0; j = 0;
while (i < seq1.length && j < seq2.length) {
if(seq2[j] <= seq1[i]) {
A[k] = seq2[j];
j++;
}
else {
A[k] = seq1[i];
i++;
}
k++;
}
+Θ(n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 12 / 19
125. MergeSort
Complexidade da Fus˜ao
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 13 / 19
126. MergeSort
Complexidade da Fus˜ao
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
+Θ(n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 13 / 19
127. MergeSort
Complexidade da Fus˜ao
while (i < seq1.length) {
A[k] = seq1[i];
k++;
i++;
}
while (j < seq2.length) {
A[k] = seq2[j];
k++;
j++;
}
}
+Θ(n)
Ou seja, merge, no
total, ´e Θ(n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 13 / 19
128. MergeSort
Complexidade do MergeSort
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
E do MergeSort?
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 14 / 19
129. MergeSort
Complexidade do MergeSort
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
E do MergeSort?
T(n/2)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 14 / 19
130. MergeSort
Complexidade do MergeSort
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
E do MergeSort?
T(n/2)
+T(n/2)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 14 / 19
131. MergeSort
Complexidade do MergeSort
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
E do MergeSort?
T(n/2)
+T(n/2)
+Θ(n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 14 / 19
132. MergeSort
Complexidade do MergeSort
void mergeSort(int[] numeros, int ini, int fim) {
if(ini < fim) {
int meio = (ini + fim)/2;
mergeSort(numeros, ini, meio);
mergeSort(numeros, meio+1, fim);
merge(numeros, ini, meio, fim);
}
}
E do MergeSort?
T(n/2)
+T(n/2)
+Θ(n)
Ent˜ao
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 14 / 19
133. MergeSort
Complexidade do MergeSort
Pelo Teorema Mestre,
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n) para n ≥ 2
cai no caso 2, fazendo com que T(n) = Θ(n log n)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 15 / 19
134. MergeSort
Complexidade do MergeSort
´E poss´ıvel fazer a intercala¸c˜ao dos sub-arranjos
ordenados sem o uso de arranjos auxiliares?
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 16 / 19
135. MergeSort
Complexidade do MergeSort
´E poss´ıvel fazer a intercala¸c˜ao dos sub-arranjos
ordenados sem o uso de arranjos auxiliares?
Sim! Basta deslocarmos os elementos de um dos
sub-arranjos, quando necess´ario, para dar lugar ao m´ınimo
dos dois sub-arranjos
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 16 / 19
136. MergeSort
Complexidade do MergeSort
´E poss´ıvel fazer a intercala¸c˜ao dos sub-arranjos
ordenados sem o uso de arranjos auxiliares?
Sim! Basta deslocarmos os elementos de um dos
sub-arranjos, quando necess´ario, para dar lugar ao m´ınimo
dos dois sub-arranjos
No entanto, a etapa de intercala¸c˜ao passa a ter
complexidade Θ(n2
), resultando na recorrˆencia
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n2
) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 16 / 19
137. MergeSort
Complexidade do MergeSort
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n2
) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 17 / 19
138. MergeSort
Complexidade do MergeSort
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n2
) para n ≥ 2
Pelo Teorema Mestre (caso 3), T(n) ∈ Θ(n2
)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 17 / 19
139. MergeSort
Complexidade do MergeSort
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n2
) para n ≥ 2
Pelo Teorema Mestre (caso 3), T(n) ∈ Θ(n2
)
Ou seja, a complexidade do MergeSort passa a ser
Θ(n2
)
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 17 / 19
140. MergeSort
Complexidade do MergeSort
T(n) =
O(1) se n = 1
2T(n/2) + Θ(n2
) para n ≥ 2
Pelo Teorema Mestre (caso 3), T(n) ∈ Θ(n2
)
Ou seja, a complexidade do MergeSort passa a ser
Θ(n2
)
Dessa forma, a eficiˆencia da etapa de intercala¸c˜ao ´e
crucial para a eficiˆencia do MergeSort
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 17 / 19
141. MergeSort × Quicksort
Mergesort
Melhor caso:
O(n log n)
Pior caso:
O(n log n)
Caso m´edio:
O(n log n)
Ordena¸c˜ao:
Necessita de arranjos
auxiliares
Quicksort
Melhor caso:
O(n log n)
Pior caso:
O(n2
)
Caso m´edio:
O(n log n)
Ordena¸c˜ao:
Local. N˜ao necessita de
arranjos auxiliares
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 18 / 19
142. Referˆencias
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
Material baseado em slides dos professores Delano Beder e
Marcos Chain
Norton Trevisan Romannorton@usp.br Aula 15 – Algoritmos de Ordena¸c˜ao: Divis˜ao e Conquista (MergeSort)9 de outubro de 2018 19 / 19